glsl顶点着色器统一变量未被激活

glsl vertex shader uniform variable not getting activated

我一直在尝试将 mat4 传递到 VS 中。 我在传递数据之前激活着色器程序:

renderProg.use();  // glUseProgram( m_programHandle );
glm::mat4 mv = view * model;
renderProg.setUniform("u_ModelViewMatrix", mv);
renderProg.setUniform("u_MVP", projection * mv);

但由于某种原因统一变量 (u_ModelViewMatrix) 未被激活并在 glGetUniformLocation 的“位置”中返回 -1。这是 VS 代码:

#version 460

layout (location = 0 ) in vec3 VertexPosition;    
uniform mat4 u_MVP;
uniform mat4 u_ModelViewMatrix;

out vec3 Position;    
void main()
{
    vec4 vp = vec4(VertexPosition, 1.0);
    Position = (u_ModelViewMatrix * vp).xyz;
    gl_Position = u_MVP * vp;
}

FS代码:

#version 460

in vec3 Position;

uniform vec4 Color;

layout( location = 0 ) out vec4 FragColor;

void main() {
  FragColor = Color;
}

只有一个制服无法设置“u_ModelViewMatrix”,另一个正在成功访问“u_MVP”。两种制服使用相同的调用来接收数据:

glUniformMatrix4fv(loc, 1, GL_FALSE, &m[0][0]);

在成功链接和编译 Vertex 和 Fragment 着色器之后,如果我正在查询活动制服,它会返回两个制服位置,一个来自 FS“Color "另一个来自VS"u_MVP"

for( int i = 0; i < nUniforms; ++i ) {
        glGetActiveUniform( m_programHandle, i, maxLen, &written, &size, &type, name );
        location = glGetUniformLocation(m_programHandle, name);
        qDebug() << "Location: " << location << " Name: " << name;
    }

输出: 位置:0 名称:颜色 位置:1 姓名:u_MVP

我做错了什么?

片段着色器中未使用接口变量 Position。所以统一变量 u_ModelViewMatrix 不是必需的。该制服被链接器“优化掉”,不会成为活动的程序资源。因此,您不会获得 "u_ModelViewMatrix".

的统一位置