我和我的一个朋友正在做一些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;
}
答案 0 :(得分:0)
尝试使用注释检查顶点着色器下的代码输出着色器编译的结果:
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]);
}
可能有任何警告或错误。 您可以使用相同的片段着色器编译