我应该在GLSL中使用条件分支来避免可能的纹理查找吗?

时间:2017-09-06 14:16:25

标签: opengl glsl textures

我有一系列关于GLSL中不统一流量控制的问题,以及它在现代桌面GPU上的性能成本。首先,我想说明我已阅读the manual但仍未找到答案。让我们开始吧。

  1. Alpha检查和零乘法优化。 哪个片段着色器工作得更快? (两者的标题相同)

    in vec2 textureCoordIn; //interpolated texture coords from vertex shader
    out vec4 outputColor; //resulted color should be here
    uniform sampler2D alphaMask; // splat alpha mask for textures1-4;
    uniform sampler2D mainTexture1;
    uniform sampler2D mainTexture2;
    uniform sampler2D mainTexture3;
    uniform sampler2D mainTexture4;
    
    void main(){
        vec4 maskValues = texture(alphaMask,textureCoordIn);
        if (maskValues.r>0){
            outputColor += maskValues.r * texture(mainTexture1,textureCoordIn);
        }
        if (maskValues.g>0){
            outputColor += maskValues.g * texture(mainTexture2,textureCoordIn);
        }
        if (maskValues.b>0){
            outputColor += maskValues.b * texture(mainTexture3,textureCoordIn);
        }
        if (maskValues.w>0){
            outputColor += maskValues.w * texture(mainTexture4,textureCoordIn);
        }
    }
    

    OR

    void main(){
        vec4 maskValues = texture(alphaMask,textureCoordIn);
        outputColor += maskValues.r * texture(mainTexture1,textureCoordIn);
        outputColor += maskValues.g * texture(mainTexture2,textureCoordIn);
        outputColor += maskValues.b * texture(mainTexture3,textureCoordIn);
        outputColor += maskValues.w * texture(mainTexture4,textureCoordIn);
    }
    

    让我们假设maskValues在50%的情况下可以有零。什么着色器会更快?另外有趣的是,如果glsl具有零乘法的内置优化。有人知道吗?

  2. 纹理数组可能错误的索引优化。避免未定义的行为? 让我们假设我们有纹理数组(sampler2DArray)。每个顶点都有ivec4属性,包含4个纹理索引。在片段着色器中,我们需要返回此索引的纹理颜色总和。仙女简单。但是,如果我们想处理大小写,当索引可以指向“null”纹理时,我们应该怎么做。在init步骤,我们可以将此索引(顶点属性)设置为“-1”,这意味着vec4(0,0,0,0)颜色。什么是最好的(也是正确的)处理方式?

    in vec2 textureCoordIn; //interpolated texture coords from vertex shader
    out vec4 outputColor; //resulted color should be here
    uniform sampler2DArray globalTextureArray;
    flat in ivec4 textureIndexes;
    
    void main(){
        if (textureIndexes.x > -1){
            outputColor += texture(globalTextureArray, vec3(textureCoordIn,textureIndexes.x));
        }
        if (textureIndexes.y > -1){
            outputColor += texture(globalTextureArray, vec3(textureCoordIn,textureIndexes.y));
        }
        if (textureIndexes.z > -1){
            outputColor += texture(globalTextureArray, vec3(textureCoordIn,textureIndexes.z));
        }
        if (textureIndexes.w > -1){
            outputColor += texture(globalTextureArray, vec3(textureCoordIn,textureIndexes.w));
        }
    }
    

    OR

    我们应该将“假”(透明 - 黑色)纹理放入globalTextureArray中,并使用它们的索引来处理这种情况。那么什么更快 - if-else fork OR 4x纹理查找?

0 个答案:

没有答案