假设您想要将额外的光线位置传递到顶点着色器(在固定功能管道提供的灯光之外),我没有看到这些额外的制服正常工作。
例如,在我的顶点着色器中,我有:
...
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的屏幕截图:
更新
我在代码中每次调用OpenGL后都添加了glGetError,它由一个函数组成。当我使用或不使用Qt的API来设置制服时,我只会出现错误,如下所示:
/*
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从263起是1282
答案 0 :(得分:0)
由于可以在顶点着色器和片段着色器中访问制服,因此没有理由将其传递通过顶点着色器。只需将统一声明移动到片段着色器并直接在那里使用。
您得到的结果可能是由于光栅化器中变量变量的插值,这意味着frag_light_pos
将为每个像素(片段)赋予不同的值。有可能使用带flat
限定符的变量来“关闭”插值,但我看不出你为什么会这样做的原因。