有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Bloom着色器性能

我从互联网上找到了一个简单漂亮的bloom着色器,但速度相对较慢

从外观上看,这里的罪魁祸首是嵌套循环和其中的纹理查找

我怎样才能让它跑得更快

uniform sampler2D u_texture;
varying vec2 v_texCoords;
void main() {
    vec4 sum = vec4(0);
    vec2 texcoord = vec2(v_texCoords);
    int j;
    int i;

    for (i = -2; i < 2; i++) {
        for (j = -2; j < 2; j++) {
            sum += texture2D(u_texture, texcoord + vec2(j, i)*0.004) * 0.25;
        }
    }
    if (texture2D(u_texture, texcoord).r < 0.3) {
        gl_FragColor = sum*sum*0.012 + texture2D(u_texture, texcoord);
    } else {
        if (texture2D(u_texture, texcoord).r < 0.5) {
            gl_FragColor = sum*sum*0.009 + texture2D(u_texture, texcoord);
        } else {
            gl_FragColor = sum*sum*0.0075 + texture2D(u_texture, texcoord);
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    我在着色器中看到的一点是,它不需要在col.r < 0.3时运行。这意味着在运行bloom着色器时,可以使用模具排除这些部分(因此着色器不会在这些像素上运行)

  2. # 2 楼答案

    我不确定“手动优化”GLSL是否合理,但您可以尝试:

    • 手动展开循环(对于(i=-2;i<;2;i++),对于(j=-2;j<;2;j++),它将为您提供16行而不是5行,但“优化”代码通常看起来“不优雅”,通常此操作应由编译器完成
    • 将纹理2D(u_纹理,texcoord)存储在向量中
    • 不要重复计算sum*sum
    • 结果应类似于: uniform sampler2D u_texture; varying vec2 v_texCoords; void main() { vec4 sum = vec4(0); vec4 col = vec4(0); vec2 texcoord = vec2(v_texCoords); sum += texture2D(u_texture, texcoord + vec2(-2, -2)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(-2, -1)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(-2, 0)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(-2, 1)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(-1, -2)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(-1, -1)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(-1, 0)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(-1, 1)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(0, -2)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(0, -1)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(0, 0)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(0, 1)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(1, -2)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(1, -1)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(1, 0)*0.004) * 0.25; sum += texture2D(u_texture, texcoord + vec2(1, 1)*0.004) * 0.25; sum *= sum; col = texture2D(u_texture, texcoord); if (col.r < 0.3) { gl_FragColor = 0.012 + col; } else { if (col.r < 0.5) { gl_FragColor = sum * 0.009 + col; } else { gl_FragColor = sum * 0.0075 + col; } } } 您还可以考虑搜索更具体的GLSL优化提示(纹理获取)、优化器工具等