flou shader Fragment ... Comment ça marche?
-
19-09-2019 - |
Question
uniform sampler2D sampler0;
uniform vec2 tc_offset[9];
void blur()
{
vec4 sample[9];
for(int i = 0; i < 9; ++i)
sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]);
gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] +
(2.0 * sample[3]) + sample[4] + 2.0 * sample[5] +
sample[6] + 2.0 * sample[7] + sample[8] ) / 13.0;
}
Comment l'échantillon [i] = Texture2D (sample0, ...) travail en ligne?
Il semble que pour rendre une image floue, je dois d'abord générer l'image, mais ici, je suis en quelque sorte d'essayer d'interroger le très iamge je générer. Comment ça marche?
La solution
Comme vous le soulignez, afin de rendre une image floue, vous devez d'abord faire une image, puis la rendre floue. Ce shader fait (juste) la deuxième étape, en prenant une image qui a été généré précédemment et la rendre floue. Il faut d'ailleurs un code supplémentaire pour générer l'image non floue d'origine.
Autres conseils
Il applique un noyau de flou à l'image. tc_offset
doit être correctement initialisé par l'application pour former une zone de 3x3 de points d'échantillonnage autour de la texture réelle coordonnée:
0 0 0
0 x 0
0 0 0
(en supposant que x est la coordonnée d'origine). Le décalage du point d'échantillonnage supérieur gauche serait -1/width,-1/height
. Le décalage pour le point central doit être aligné avec soin du centre de texel (le problème off-by-0.5). En outre, le filtre bilinéaire matériel peut être utilisé pour augmenter à moindre coût la quantité de flou (par échantillonnage entre texels).
Le reste du shader échelles les échantillons par leur distance. Habituellement, cela est précalculée ainsi:
for(int i = 0; i < NUM_SAMPLES; ++i) {
result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
}
Une façon est de générer votre image originale pour rendre à une texture, pas à l'écran. Et puis vous dessinez un quad en plein écran en utilisant ce shader et la texture comme il est entrée post-traitement de l'image.