对于第二个统一,OpenGL无法找到glGetUniformLocation的统一

时间:2013-12-11 15:26:47

标签: c++ opengl shader uniform

我和我的一个朋友正在做一些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;
}

1 个答案:

答案 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]);
}

可能有任何警告或错误。 您可以使用相同的片段着色器编译