OpenGL着色器:统一变量计数不正确

时间:2014-02-20 15:13:08

标签: c++ opengl textures glsl shader

我想做凹凸/法线/视差贴图,但为此我需要多纹理 - 一次使用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 );
    }

以及片段1的以下内容:

    #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报告的唯一活动均匀变量是顶点着色器的均匀顶点MVp和片段一的cTex。 hTex无法识别并查询其位置,结果为-1。图形卡支持GL_ARB_multitexture OpenGL扩展(支持最高4.3的OpenGL版本)。

测试了提供here的简单多纹理示例,该示例仅使用stock vertex one定义了片段着色器。这个例子就像一个魅力。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

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

因此,由完全链接的程序暴露的制服被称为“主动”制服;原始着色器指定的任何其他制服均处于非活动状态。非活动制服不能用于在程序中执行任何操作。“ - OpenGL.org

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