我从网上找到了一个简单漂亮的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);
}
}
}发布于 2014-05-20 19:57:04
我不确定“手动优化”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优化技巧(纹理抓取),优化器工具等发布于 2014-05-20 20:29:35
我在着色器中看到的一件事是,当col.r < 0.3时它不需要运行,这意味着当运行bloom着色器时,您可以使用模具排除这些部分(因此着色器不会在这些像素上运行
https://stackoverflow.com/questions/23757418
复制相似问题