2017-07-11 50 views
1

我的最終目標是圍繞紋理創建輪廓。要做到這一點,我必須從鄰居片段獲取數據,並且我正在通過使用texelFetch來解決這個問題。在我嘗試使用texelFetch時,我只是試圖從片段的顏色數據到每個片段的右側,然後將片段的顏色變成白色,如果右側的片段不透明。但是,這並不正常工作,這是我在片段着色器代碼來測試texelFetch:試圖從GLSL中的texelFetch獲取鄰居片段的數據

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; 
} 

有沒有人有什麼我可以做錯誤的想法?

非常感謝您檢查我的問題。

回答

1

有兩種方法可以獲取紋理中的鄰居片段。無論您使用texelFetch,爲你做決定,或者你使用texture

如果你使用一個紋理像素的texelFetch地址是紋理像素的索引行和列。 我假設v_texCoord0是在(0.0,1.0)範圍內的紋理座標,而不是紋理的索引。 你必須乘以紋理大小的紋理座標以獲得指數:

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; 

另一種可能是使用texture和calcualte 1個紋理的抵消:

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

它完美!非常感謝Rabbid76! –