我從網上找到了一個簡單而美麗的綻放着色器,但速度相對較慢。綻放着色器性能
從外觀上看,這裏的罪魁禍首是嵌套循環和紋理查找。
我該如何讓這個運行更快?
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);
}
}
}
時排除這些部分(所以着色器不會在這些像素上運行),這是bloom問題,因爲速度很慢它在該嵌套循環中查詢紋理25次 –
這是一個可分離的過濾器,有時兩遍(水平和垂直)比1快 - 特別是當你開始使用更大的樣本窗口(這是一個5x5的內核)。您還可以利用硬件的內置功能快速對4個像素進行採樣和平均(線性濾波)。 –
Err,現在我更仔細地看,這是一個4x4的內核。你爲什麼這麼做?我認爲你的循環應該包括*** I,j = 2而不是*結尾*。理想情況下,它將被分成兩個通道,所以每次通過我只有[-2,2] = 5次取回。 –