Fragment-shader Blur ... como isso funciona?
-
19-09-2019 - |
Pergunta
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;
}
Como funciona a amostra [i] = texture2d (sample0, ...) de linha?
Parece desfocar uma imagem, eu tenho que gerar primeiro a imagem, mas aqui estou de alguma forma tentando consultar o próprio iamge que estou gerando. Como é que isso funciona?
Solução
Como você observa, para fazer uma imagem turva, primeiro você precisa fazer uma imagem e depois embaçar. Esse shader faz (apenas) o segundo passo, pegando uma imagem que foi gerada anteriormente e desfocando -a. É preciso haver um código adicional em outro lugar para gerar a imagem original não em blindagem.
Outras dicas
Ele aplica um núcleo desfoque à imagem. tc_offset
precisa ser inicializado corretamente pelo aplicativo para formar uma área 3x3 de pontos de amostragem em torno da coordenada de textura real:
0 0 0
0 x 0
0 0 0
(assumindo que x é a coordenada original). O deslocamento para o ponto de amostragem superior esquerda seria -1/width,-1/height
. O deslocamento para o ponto central precisa ser cuidadosamente alinhado ao Texel Center (o problema fora de 0,5). Além disso, o filtro bilinear de hardware pode ser usado para aumentar a quantidade de desfoque (por amostragem entre os Texels).
O restante do shader escala as amostras à sua distância. Geralmente, isso também é pré -computado:
for(int i = 0; i < NUM_SAMPLES; ++i) {
result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
}
Uma maneira é gerar sua imagem original para renderizar uma textura, não para a tela. E então você desenha um quad de tela cheia usando este shader e a textura, pois é a entrada para pós-processo da imagem.