0

J'essaie d'effectuer une opération de flou dans le fragment shader en attachant une texture (myTexture) à mon objet framebuffer. Il fonctionne avec ce code:Opération de flou dans le fragment shader avec des valeurs à virgule flottante

vec3 blur(float depth){ 
float dx = 1.0f/800; 
float dy = 1.0f/800; 
vec3 sum = vec3(0,0,0); 
int dep=depth*10; 
for(int i=-dep;i<dep;i++) 
for(int j=-dep;j<dep;j++) 
    sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz; 
return sum/40; 
} 

Mais si je le modifier au code ci-dessous, il ne fonctionne pas (l'écran devient blanc pour une raison quelconque, peut-être la lecture de ma texture de profondeur, mais je ne sais pas pourquoi)

vec3 blur(float depth){ 
float dx = 1.0f/800; 
float dy = 1.0f/800; 
vec3 sum = vec3(0,0,0); 
float dep=depth*10; 
for(float i=dep;i<dep;i+=0.2f) 
for(float j=dep;j<dep;j+=0.2f) 
    sum += texture(myTexture, otex + vec2(i * dx, j * dy)).xyz; 
return sum/40; 
} 

la raison pour laquelle je suis en train de le faire parce que je veux brouiller en fonction de la valeur de la profondeur de l'objet. Si l'objet est loin, flouter plus. Si c'est proche, flou moins. Si j'utilise le premier code, j'obtiens un flou étagé, c'est-à-dire si la profondeur est 0.3 flou trois fois, si la profondeur est 0.2 flou deux fois ....... Je veux utiliser les valeurs en virgule flottante pour obtenir un transition en douceur entre les valeurs de flou au lieu des valeurs étagées

Qu'est-ce que je fais mal? En outre, existe-t-il un autre moyen d'obtenir une transition en douceur entre les valeurs de flou.

Merci.

Répondre

0

vous eu 2 problèmes:

  1. Normaliser avec sum/40

    au lieu de 40 constante, vous devez diviser par le nombre d'ajouts qui est ~(2*10*depth)^2 dans le premier code. Le deuxième code est erroné ...

  2. boucle mal en second code

    Le résultat sum de votre deuxième morceau est (0,0,0) il devrait être noir à moins que vous faites quelque chose au-dessus de cela. Parce que vous avez une erreur dans:

    for(float i=dep;i<dep;i+=0.2f) 
    for(float j=dep;j<dep;j+=0.2f) 
    

    il ne va jamais à l'intérieur. Je suppose que vous vouliez ceci:

    for(float i=-dep;i<dep;i+=0.2f) 
    for(float j=-dep;j<dep;j+=0.2f) 
    

    dans ce cas, vous devez normaliser avec ~(2*10*5*depth)^2