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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top