我目前正在学习OpenGL编程,而且我取得了一些很好的进展,但现在我似乎被卡住了。在OpenGL着色器中无法设置统一值
目前,我正试图让简单的着色器工作。更具体地说,我想设置着色器的统一值。着色器编译成功,并且如果消除统一值,则可以正常工作。这里是(顶点)着色器代码:
#version 440 core
layout(location = 0) in vec3 vertex;
uniform mat4 mvp;
void main()
{
gl_Position = mvp * vec4(vertex, 1);
}
和代码我用它来设置的值(glGetUniformLocation
返回0如预期):
mvp = glm::mat4(
glm::vec4(3.0f, 0.0f, 0.0f, 0.0f),
glm::vec4(0.0f, 1.0f, 0.0f, 0.0f),
glm::vec4(0.0f, 0.0f, 1.0f, 0.0f),
glm::vec4(0.0f, 0.0f, 0.0f, 2.0f)
);
GLuint matrix = glGetUniformLocation(program, "mvp");
glUniformMatrix4fv(matrix, 1, GL_FALSE, glm::value_ptr(mvp));
的问题是,它不似乎确定了价值。如果我使用glGetUniformfv
查询制服的价值,它会返回默认值(不是我刚刚设置的那个),并且几何不会显示出来(但这只是一个结果,这里不是问题)。
如果我在着色器中对制服的值进行硬编码,应用程序将正确显示几何图形,并在被问及该值(同样使用glGetUniformfv
)时,它会返回正确的值。
#version 440 core
layout(location = 0) in vec3 vertex;
uniform mat4 mvp = mat4(
vec4(1.0f, 0.0f, 0.0f, 0.0f),
vec4(0.0f, 1.0f, 0.0f, 0.0f),
vec4(0.0f, 0.0f, 1.0f, 0.0f),
vec4(0.0f, 0.0f, 0.0f, 2.0f)
);
void main()
{
gl_Position = mvp * vec4(vertex, 1);
}
任何想法,为什么会发生这种情况?我使用的是OpenGL 4.4,但我尝试了许多不同的版本,结果相同。
感谢您的时间和努力,
利文特
你是一个救星,谢谢。我没有意识到在设置制服之前我必须调用'glUseProgram',但它确实有道理。 – skreborn
和'glUseProgram()'和'glGetUniformLocation()'实际上可以交换,对吧? – mlvljr
不,因为glUseProgram首先设置了正确的状态,而glGetUniformLocation依赖于该状态来获取制服的位置。 – prabindh