J'ai trouvé un shader bloom simple et magnifique sur Internet, mais il est relativement lent. En apparence, le coupable est la boucle imbriquée et une recherche de texture en son sein.Bloom Shader Performance
Comment est-ce que je pourrais faire courir ceci plus rapidement?
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);
}
}
}
qui est le problème avec la floraison, c'est lent car il interroge la texture 25 fois dans cette boucle imbriquée –
Il s'agit d'un filtre séparable, parfois deux passes (horizontal et vertical) est plus rapide que 1 - en particulier lorsque vous commencez à utiliser des fenêtres d'échantillons plus grandes (c'est un noyau 5x5). Vous pouvez également tirer parti de la capacité intégrée du matériel à échantillonner et à calculer rapidement 4 texels à la fois (filtrage linéaire). –
Err, maintenant que je regarde de plus près, c'est un noyau 4x4. Pourquoi fais-tu ça de façon déséquilibrée? Je pense que votre boucle devrait effectivement inclure *** I, j = 2 plutôt que * finissant * là. Idéalement, il serait divisé en deux passes, donc juste [-2,2] = 5 fetchs par passe. –