【问题标题】:OpenGL shaders: uniform variables count incorrectOpenGL着色器:统一变量计数不正确
【发布时间】:2014-02-20 15:13:07
【问题描述】:

我想做凹凸/法线/视差映射,但为此我需要多重纹理 - 一次使用 2 个纹理 - 一个用于颜色,一个用于高度图。但这项任务的完成似乎存在荒谬的问题。

我有以下顶点着色器代码:

    #version 330 core

    /* 0: in
     * 1: out
     * 2: uniform
     */

    // 0: in
    layout (location = 0) in vec3 v_vertexPos;
    layout (location = 1) in vec2 v_vertexTexCoord;

    // 1: out
    out vec2 f_vertexTexCoord;

    // 2: uniform
    uniform mat4 vertexMvp = mat4( 1.0f );

    void main()
    {
        f_vertexTexCoord = v_vertexTexCoord;
        gl_Position = vertexMvp * vec4( v_vertexPos, 1.0f );
    }

片段一如下:

    #version 330 core

    /* 0: in
     * 1: out
     * 2: uniform
     */

    // 0: in
    in vec2 f_vertexTexCoord;

    // 1: out
    layout (location = 0) out vec4 f_color;

    // 2: uniform
    uniform sampler2D cTex;
    uniform sampler2D hTex;

    // #define BUMP

    void main()
    {
        vec4 colorVec = texture2D( cTex, f_vertexTexCoord );

    #ifdef BUMP
        vec4 bumpVec = texture2D( hTex, f_vertexTexCoord );
        f_color = vec4( mix( bumpVec.rgb, colorVec.rgb, colorVec.a), 1.0 );
    #else
        f_color = texture2D( cTex, f_vertexTexCoord );
    #endif
    }

着色器被编译并附加到着色器程序。该程序然后被链接,然后使用。 glGetActiveUniform 唯一报告的活动统一变量是顶点着色器的统一 vertexMvp 和片段一个的 cTex。 hTex 未被识别并查询其位置,结果为 -1。显卡支持GL_ARB_multitexture OpenGL扩展(支持OpenGL版本最高4.3)。

测试了here 提供的简单多纹理示例,它只定义了片段着色器,使用股票顶点之一。这个例子就像一个魅力。

有什么建议吗?

【问题讨论】:

  • 如果不使用制服,着色器编译器会将它们优化掉。在这种情况下,您将获得 -1 作为他们的位置。
  • 完全正确的答案。
  • 没有错。您已将着色器中实际使用 hTex 的部分进行了预处理。链接器将确定统一在链接程序中处于非活动状态,并且不会分配统一位置。这本身不是优化,编译器也不会这样做。

标签: c++ opengl textures glsl shader


【解决方案1】:

“GLSL 编译器和链接器试图尽可能高效。因此,它们会尽最大努力消除不影响阶段输出的代码。因此,不必制作着色器文件中定义的统一在链接的程序中可用。仅当影响阶段输出的代码使用该制服时才可用,并且制服本身可以改变阶段的输出。

因此,由完全链接的程序公开的制服称为“活动”制服;由原始着色器指定的任何其他制服均处于非活动状态。不能使用非活动制服在程序中做任何事情。" - OpenGL.org

由于片段着色器中未定义 BUMP,因此您的代码中未使用 hTex,因此不是活动制服。这是预期的行为。

【讨论】:

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