2017-07-11 2 views
1

Mon but ultime est de créer un contour autour d'une texture. Pour ce faire, je dois obtenir des données à partir des fragments voisins et j'essaie cela en utilisant texelFetch. Dans mon essai d'utilisation de texelFetch, j'essaie simplement d'obtenir les données de couleur du fragment à la droite de chaque fragment, puis de rendre blanc la couleur du fragment si le fragment à droite n'est pas transparent. Mais cela ne fonctionne pas, voici mon code dans le fragment shader pour tester texelFetch:Essayer d'obtenir des données à partir de fragments voisins avec texelFetch dans GLSL

varying vec4 v_color; 
varying vec2 v_texCoord0; 

uniform vec3 dif_color; 

uniform sampler2D u_sampler2D; 

vec4 color_right; 
vec4 color_left; 
vec4 color_bottom; 
vec4 color_top; 

void main(){ 
    color_right = texelFetch(u_sampler2D, ivec2(v_texCoord0.x + 1, v_texCoord0.y), 0).rgba; 

    if(color_right.a != 0){ 
    color.rgba = (1,1,1,1); 
    } 
    else{ 
    color.rgba = (0,0,0,0); 
    } 

    gl_FragColor = color; 
} 

Quelqu'un at-il une idée de ce que je aurais pu faire de mal?

Merci beaucoup de vérifier ma question.

Répondre

1

Il existe deux façons d'obtenir le fragment voisin dans une texture. Soit vous utilisez texelFetch, comme vous avez décidé, ou vous utilisez texture:

Si vous utilisez texelFetch la adresse d'un texel est l'indice des texels ligne et colonne. Je suppose que v_texCoord0 est les coordonnées de texture dans la plage (0.0, 1.0) et non l'indice du texel. Vous devez multiplier les coordonnées de texture avec la taille de la texture pour obtenir l'index:

ivec2 texSize = textureSize(u_sampler2D, 0); 
iVec2 texIndex = ivec2(int(v_texCoord0.x * float(texSize.x)), int(v_texCoord0.y * float(texSize.y))); 
color_right = texelFetch(u_sampler2D, texIndex + ivec2(1, 0), 0).rgba; 

L'autre possibilité est d'utiliser texture et calcualte pour compenser 1 texel:

ivec2 texSize = textureSize(u_sampler2D, 0); 
vec2 texStep = vec2(1.0/float(texSize.x), 1.0/float(texSize.y)); 
color_right = texture(u_sampler2D, v_texCoord0 + texStep * vec2(1.0, 0.0)).rgba; 
+0

Il fonctionne parfaitement! Merci beaucoup Rabbid76! –