2014-02-23 47 views
3

我目前正在学习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,但我尝试了许多不同的版本,结果相同。

感谢您的时间和努力,
利文特

回答

10

你叫设置制服前glUseProgram?一个完整的工作清单可在很多例子在网上找到,包括我曾经的某个时候写回(https://github.com/prabindh/sgxperf/blob/master/sgxperf_gles20_vg.cpp),显示顺序为:

glCreateProgram();

glAttachShader()

glLinkProgram

glUseProgram()

glGetUniformLocation()

glUniformMatrix4fv

+0

你是一个救星,谢谢。我没有意识到在设置制服之前我必须调用'glUseProgram',但它确实有道理。 – skreborn

+0

和'glUseProgram()'和'glGetUniformLocation()'实际上可以交换,对吧? – mlvljr

+2

不,因为glUseProgram首先设置了正确的状态,而glGetUniformLocation依赖于该状态来获取制服的位置。 – prabindh