Я использую OpenGL и GLSL для рисования текстуры на простой сетке.
Моя проблема в том, что когда я использую glUniform1i
для установки значения формы sampler2D, оно не было установлено. Например, в этом коде:
glUseProgram(programObject);
glUniform1i(glGetUniformLocation(programObject, "texture"), 1);
GLint val;
glGetUniformiv(programObject,
glGetUniformLocation(programObject, "texture"),
&val);
printf("Value is %d\n", val);
Значение, выводимое в командной строке, равно 0. Я проверил, что шейдеры скомпилированы правильно и программа скомпонована правильно. glGetUniformLocation
выводит индекс > 0. Более того, glGetError
не выводит никакой ошибки ни в одной точке.
Это происходит только тогда, когда форма является сэмплером. Поскольку текстура не задана, запрос ее в шейдере всегда возвращает (0, 0, 0, 0, 1). (Я также проверил, используя apitrace, что моя текстура правильно привязана к GL_TEXTURE1
, что делается сразу после показанного кода).
Я много искал по этой проблеме и нашел только один случай чего-то подобного здесь. Решением было инициализировать GLEW, но мне это не помогло.
Я буду рад предоставить любую необходимую расширенную информацию (или трассировку из apitrace).
Edit
Вот шейдер:
uniform sampler2D texture;
varying vec2 textureCoord;
void main() {
gl_FragColor = texture2D(texture, textureCoord);
}
Solution
Мне удалось решить проблему после некоторой работы.
Как выяснилось, проблема не связана с тем, что форма не была установлена, так как возврат 0 для сэмплеров независимо от фактического значения, похоже, является причудой реализации gl. Это происходило только в драйвере Intel для Sandy Bridge. Тестирование кода в других реализациях всегда возвращало правильное значение сэмплера.
Проблема с тем, что текстура всегда возвращала (0, 0, 0, 0, 1), была вызвана ошибкой, которую я допустил при генерации текстуры.
Теперь glGerUniformiv
по-прежнему возвращает 0, но текстура используется правильная.