GLSL子程序和着色器制服。为什么我的制服优化了?

时间:2018-01-16 10:22:43

标签: opengl glsl shader

好的,我正在尝试使用一些在子程序函数内部使用的着色器统一变量(因此在子程序函数之外根本没有调用这些变量)。 / p>

重要的部分:我直接在着色器ma​​in中调用此子程序函数,而不是我有子程序统一数组我填充使用glUniformSubroutinesuiv并使用此语法来调用它们:

    my_subroutines[i]();

我的问题是所有的统一变量都被优化了。 我已经检查了什么:

  • 子程序函数本身没有优化(我找到了它们 通过glGetActiveSubroutineName,他们在着色器之后 链接)。这总是如此,即使内部没有任何电话 着色器主要。
  • 如果我直接通过shader main中的名称调用我的子程序函数,那么制服优化(通过glGetActiveUniform找到它们)

那么,这是正常行为吗?如何保持我的统一变量而不做一些像这样的麻烦:

    void main()
    {
        vec4 color;

        //force use of uniform variables to prevent them be optimized out
        color += 0.0001*(uniform_variable0 + uniform_variable1 + ... + uniform_variableN);

        //call my subroutines here (that uses the same uniforms ... cmon glsl)
        color = subroutines_array[0](color);
        color = subroutines_array[1](color);
        ...
        color = subroutines_array[N](color);

        FragColor = color;
    }

1 个答案:

答案 0 :(得分:0)

发现我做错了:

    void main()
    {
        vec4 color;

        //so i never updated my color here, and that's why uniforms was cut out
        subroutines_array[0](color);
        subroutines_array[1](color);
        ...
        subroutines_array[N](color);

        FragColor = color;
    }