我和我的一个朋友正在做一些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;
}发布于 2013-12-12 00:20:05
尝试使用注释检查顶点着色器下的代码输出着色器编译的结果:
GLint Result = GL_FALSE;
int InfoLogLength;
// Compile Vertex Shader
printf("Compiling shader : %s\n", vertex_file_path);
char const * VertexSourcePointer = VertexShaderCode.c_str();
glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL);
glCompileShader(VertexShaderID);
// Check Vertex Shader
glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
if ( InfoLogLength > 0 ){
std::vector<char> VertexShaderErrorMessage(InfoLogLength+1);
glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
printf("%s\n", &VertexShaderErrorMessage[0]);
}也许有任何警告或错误。与片段着色器编译使用的相同
https://stackoverflow.com/questions/20523069
复制相似问题