【发布时间】:2013-12-11 15:26:46
【问题描述】:
我和我的一个朋友正在做一些 3D 编程,我们正试图找出一个重点。我们正在尝试在顶点着色器中为我们的灯光位置访问一个制服,但没有找到。
这里有一些代码:
GLuint program = LoadShaders(shaders);
glUseProgram(program);
rotationLoc = glGetUniformLocation(program,"vRotationMatrix");
if(rotationLoc != -1)
glUniformMatrix4fv(rotationLoc,1,GL_TRUE,&world.rotationMatrix[0][0]);
LightLoc = glGetUniformLocation(program, "vLightPos");
if (LightLoc != -1)
glUniform3fv(LightLoc, 1, LightPos);
如您所见,我们首先对旋转矩阵执行相同的操作。它适用于旋转矩阵,但不适用于 LightLoc。 错误行是: LightLoc = glGetUniformLocation(program, "vLightPos"); LightLoc 返回 -1,但它应该返回 2。
我们的顶点着色器(部分)看起来像这样:
uniform mat4 vRotationMatrix;
uniform vec3 vLightPos;
void main()
{
color = vColor;
oTexCoord = vTexCoord;
gl_Position = vRotationMatrix * vPosition;
lightPos = vLightPos;
}
【问题讨论】:
-
lightPos的定义是什么?
-
我们根据:out vec3 lightPos 在顶点着色器中定义lightPost。
-
然后它会被覆盖吗?在正确拼写的制服上使用 -1 的一个常见原因是它已被优化(通常通过删除死代码)。
-
片段着色器是否正在使用
lightPos? -
它没有被使用,但我们已经在我们的片段着色器中将它定义为一个不变量。但是,即使我们不将它作为顶点着色器的外向量发送,它仍然不起作用。