首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bloom Shader性能

Bloom Shader性能
EN

Stack Overflow用户
提问于 2014-05-20 18:35:02
回答 2查看 189关注 0票数 0

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

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

我怎么才能让它运行得更快呢?

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-05-20 19:57:04

我不确定“手动优化”GLSL是否有任何意义,但您可以尝试:

  • 手动展开循环(for (i = -2;i< 2;i++),for (j = -2;j< 2;j++)),它会给你16行代码,而不是5行,但是‘优化’的代码经常看起来‘不优雅’,通常这个操作应该由compiler...
  • store texture2D(u_texture,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优化技巧(纹理抓取),优化器工具等
票数 0
EN

Stack Overflow用户

发布于 2014-05-20 20:29:35

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23757418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档