Я использую 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, 1). (Я также проверил, используя apitrace , что моя текстура правильно связана с GL_TEXTURE1
, что делается сразу после показанного кода).
Я много раз искал эту проблему, и я нашел только один экземпляр чего-то похожего на этот здесь . Решением было инициализировать GLEW, но у меня это не сработало.
Я рад предоставить любую необходимую расширенную информацию (или трассировку от apitrace).
Редактировать
Вот шейдер:
uniform sampler2D texture;
varying vec2 textureCoord;
void main() {
gl_FragColor = texture2D(texture, textureCoord);
}
Решение
Мне удалось решить проблему после некоторой работы.
Как выяснилось, эта проблема возникла не из-за того, что не была задана униформа, так как всегда возвращение 0 для сэмплеров независимо от фактического значения, похоже, является особенностью реализации gl. Это произошло под драйвером Intel только для Sandy Bridge. Тестирование кода в других реализациях всегда возвращало правильное значение сэмплера.
Проблема возврата текстуры (0, 0, 0, 1) всегда была связана с ошибкой, которую я допустил во время генерации текстуры.
Теперь glGerUniformiv
по-прежнему возвращает 0, но используется правильная текстура.