2017-05-27 103 views
0

我正在学习使用GLUT和GLEW库的OpenGL。 但我有一个关于在程序的片段着色器中设置统一值的问题。将统一值设置为片段着色器(OpenGL)

以下是片段着色器代码的一部分。

#version 110 
uniform vec4 cameraPosition; 
uniform vec4 lightPosition; 

varying vec4 fragColor; 
varying vec4 fragNormal; 
varying vec4 fragPosition; 

void main() { 
    vec4 L = lightPosition - fragPosition; 
    vec4 V = cameraPosition - fragPosition; 

我想要做的是设置'cameraPosition'和'lightPosition'统一变量。 另外,在主程序中,我放了一些代码来获取这些变量ID并将一些值传递给下面的变量。

GLuint cameraPositionID = glGetUniformLocation(programID, "cameraPosition"); 
GLuint lightPositionID = glGetUniformLocation(programID, "lightPosition"); 
GLfloat camPos[4] = { 1, 1, -3, 1 }; 
GLfloat lightPos[4] = { 1, 0, 0, 1 }; 
glUniform4fv(cameraPositionID, 4, &cameraPos[0]); 
glUniform4fv(lightPositionID, 4, &lightPos[0]); 

因此,我尝试将camPos传递到cameraPosition,并将lightPos转换为lightPosition。 它正确或不正确?如果你认为不正确,你有什么想法吗?

回答

2

glUniform4fvcount参数表示要设置的统一阵列的数量 - 在此情况下,有多少个vec4 s。你没有数组,所以count必须是一个。根据规范,你的命令应该导致GL_INVALID_OPERATION错误,而不是设置任何统一值。 (除此之外,使用计数4也会从内存中读取16个浮点数,而您的数组只有4个浮点数)。

在尝试设置这些制服之前,您是否还做过glUspeProgram(programID)也不清楚。由于制服是每个程序状态,因此glUniform*()命令仅适用于当前绑定的程序。

+0

好吧,现在清楚了,我把1放入count后,而不是4.非常感谢:) D:D – xpathz