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);
}
}
}
# 1 楼答案
我在着色器中看到的一点是,它不需要在
col.r < 0.3
时运行。这意味着在运行bloom着色器时,可以使用模具排除这些部分(因此着色器不会在这些像素上运行)# 2 楼答案
我不确定“手动优化”GLSL是否合理,但您可以尝试:
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优化提示(纹理获取)、优化器工具等