【问题标题】:glsl vertex shader uniform variable not getting activatedglsl顶点着色器统一变量没有被激活
【发布时间】:2021-08-24 06:11:56
【问题描述】:

我一直在尝试将 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]);

在顶点和片段着色器成功链接和编译后,如果我正在查询活动制服,它返回两个制服位置,一个来自 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

我在这里做错了什么?

【问题讨论】:

    标签: c++ opengl glsl shader glm-math


    【解决方案1】:

    片段着色器中未使用接口变量Position。所以统一变量u_ModelViewMatrix 不是必需的。这种统一由链接器“优化”出来,不会成为活动的程序资源。因此你不会得到"u_ModelViewMatrix" 的统一位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      相关资源
      最近更新 更多