GLSL分支优化与制服

时间:2018-02-27 15:03:13

标签: opengl-es shader opengl-es-3.0

据我所知,OpenGL ES的一些现代实现优化了从统一值中获取的分支,以避免线程分歧,我对此有一些疑问。

  1. 如果我是根据统一变量的比较或者甚至在两个统一变量之间进行分支,那么这个分支是否仍然可以优化以避免线程分歧?在这些情况下,GLSL会在多大程度上折叠常量表达式?
  2. 此属性是否会转移到从统一缓冲区对象访问的结构的成员?假设我有一个统一的全局变量index,将索引定义为与正在运行的着色器相关的结构数组,并且glDraw调用上的所有片段都从统一块访问相同的数据并使用其中一个它是有条件分支的成员。

    uniform int u_index;
    struct ShaderData {
        bool condition1;
        bool condition2;
        lowp vec2 value;
    };
    
    layout(std140) uniform u_input {
        ShaderData u_data[64];
    };
    
    void main() {
        ShaderData instance = u_data[u_instance];
        if (instance.condition1) {
            // optimized?
        }
    
        if (instance.condition1 && instance.condition2) {
            // optimized?
        }
    
        if (instance.value.x > instance.value.y) {
            // optimized?
        }
    }
    
  3.   

    注意:这个问题与Does If-statements slow down my shader?类似,但我特别关注使用统一块而不仅仅是制服的信息,以及有关基于值的创建条件的说明制服。我在询问之前已经阅读了另一个,但它没有完全回答我的问题。

0 个答案:

没有答案