试图从GLSL中的texelFetch获取邻居片段的数据
问题描述:
我的最终目标是围绕纹理创建轮廓。要做到这一点,我必须从邻居片段获取数据,并且我正在通过使用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;
}
有没有人有什么我可以做错误的想法?
非常感谢您检查我的问题。
答
有两种方法可以获取纹理中的邻居片段。无论您使用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;
它完美!非常感谢Rabbid76! –