Предполагая, что вы хотите передать вершинному шейдеру дополнительные позиции света (за пределами источников света, обеспечиваемых фиксированным функциональным конвейером), я не вижу, чтобы эти дополнительные униформы работали правильно.
Например, в моем вершинном шейдере у меня есть:
...
uniform vec3 light_pos;
...
varying vec3 frag_light_pos;
void main() {
...
frag_light_pos = vec3(0.0f, 100.0f, 0.0f);
//frag_light_pos = light_pos;
...
}
Где разница в моей сцене можно увидеть ниже.
Чтобы установить юниформ-переменную, я использую Qt QOpenGLShaderProgam::setUniformValue
следующим образом.
QVector3D light_pos(0.0f, 100.0f, 0.0f);
m_ShaderProgram->setUniformValue("light_pos", light_pos);
Все мои другие униформы, mv, mvp и (trans(mv))^-1 работают, так что это не проблема с Qt. Где я ошибаюсь? Я ожидаю увидеть одно и то же изображение, используя любую версию.
Снимок экрана с использованием const vec3:
Снимок экрана с использованием универсального vec3:
Обновить
Я добавил glGetError после каждого вызова OpenGL в свой код, состоящий из одной функции. Я получаю сообщение об ошибке только тогда, когда я задаю униформу как с использованием API Qt, так и без него, как показано ниже:
/*
QVector3D light_pos(0.0f, 100.0f, 0.0f);
m_ShaderProgram->setUniformValue("frag_light_pos", light_pos); GL_CALL
/*/
GLint light_id = glGetUniformLocation(m_ShaderProgram->programId(),
"frag_light_pos"); GL_CALL
glUniform3f(light_id, 10.0f, 10.0f, 10.0f); GL_CALL
//*/
Где GL_CALL определяется как:
#define GL_CALL GetGlErrors(__LINE__);
void GetGlErrors(int line)
{
GLenum err_code;
while ((err_code = glGetError()) != GL_NO_ERROR) {
#if __GL_WRAPPER_WINDOWS__
char buffer[256];
sprintf_s(buffer, "GL_ERROR is %d from %d\n", err_code, line);
OutputDebugStringA(buffer);
#else
printf("GL_ERROR is %d from %d\n", err_code, line);
#endif
}
}
Вывод моей программы показывает мне строку с данной ошибкой:
GL_ERROR 1282 вместо 263