【发布时间】:2015-03-28 05:50:19
【问题描述】:
假设您想要将额外的灯光位置传递给顶点着色器(在固定功能管道提供的灯光之外),我没有看到这些额外的制服正常工作。
例如,在我的顶点着色器中,我有:
...
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
【问题讨论】:
标签: c++ qt opengl-es glsl lighting