【问题标题】:OpenGL cannot find uniform with glGetUniformLocation for second uniformOpenGL 无法使用 glGetUniformLocation 找到第二个制服的制服
【发布时间】: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
  • 它没有被使用,但我们已经在我们的片段着色器中将它定义为一个不变量。但是,即使我们不将它作为顶点着色器的外向量发送,它仍然不起作用。

标签: c++ opengl shader uniform


【解决方案1】:

尝试使用comment check vertex shader下的代码输出shader编译的结果:

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

可能有任何警告或错误。 您可以将其用于片段着色器编译

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多