Это выглядит довольно неплохо, но я вижу, что вы, во-первых, вызываете glUniform внутри setupTexture, в то время как шейдер не имеет текущих ограничений.Вы должны вызывать glUniform только после вызова glUseProgram.
Я не знаю, в этом ли проблема, потому что я бы предположил, что в любом случае это будет значение по умолчанию 0, но я точно не знаю.
Кроме этого, вам следует познакомиться с вызовом glGetError, чтобы проверить, есть ли какие-либо ожидающие ошибки условия.
Кроме того, при создании шейдеров полезно проверять их статус успеха с помощью glGetShader (GL_COMPILE_STATUS)также glGetShaderInfoLog, если компиляция не удалась, и аналогична для программ с glGetProgram / glGetProgramInfoLog.