glUniform не может установить значение сэмплера - PullRequest
5 голосов
/ 21 февраля 2012

Я использую 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, но используется правильная текстура.

1 Ответ

3 голосов
/ 10 мая 2012

Решение

Мне удалось решить проблему после некоторой работы.

Как оказалось, эта проблема была не из-за того, что униформа не была установлена,как всегда возвращение 0 для сэмплеров независимо от фактического значения, кажется странным из реализации gl.Это произошло под драйвером Intel только для Sandy Bridge.Тестирование кода в других реализациях всегда возвращало правильное значение сэмплера.

Проблема возврата текстуры (0, 0, 0, 1) всегда была из-за ошибки, которую я допустил во время генерации текстуры.

Теперь glGerUniformiv по-прежнему возвращает 0, но используется правильная текстура.

...