尝试使用GLSL中的texelFetch从相邻碎片获取数据

尝试使用GLSL中的texelFetch从相邻碎片获取数据,glsl,glsles,Glsl,Glsles,我的最终目标是围绕纹理创建轮廓。要做到这一点,我必须从相邻的片段中获取数据,我正在使用texelFetch进行尝试。在我尝试使用texelFetch时,我只是尝试从每个片段右侧的片段获取颜色数据,然后如果右侧的片段不透明,则将片段的颜色变为白色。但这不起作用,下面是我在片段着色器中测试texelFetch的代码: varying vec4 v_color; varying vec2 v_texCoord0; uniform vec3 dif_color; uniform sampler2D

我的最终目标是围绕纹理创建轮廓。要做到这一点,我必须从相邻的片段中获取数据,我正在使用texelFetch进行尝试。在我尝试使用texelFetch时,我只是尝试从每个片段右侧的片段获取颜色数据,然后如果右侧的片段不透明,则将片段的颜色变为白色。但这不起作用,下面是我在片段着色器中测试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
,则texel的地址是texel行和列的索引。 我假设
v_texCoord0
是范围(0.0,1.0)内的纹理坐标,而不是texel的索引。 必须将纹理坐标与纹理大小相乘才能获得索引。纹理的大小可以通过以下方式获得:

另一种可能是使用
纹理
并计算两个texel之间的偏移:

ivec2 texSize  = textureSize(u_sampler2D, 0);
vec2 texOffset = 1.0 / vec2(texSize.xy);
color_right    = texture(u_sampler2D, v_texCoord0 + texOffset * vec2(1.0, 0.0)).rgba;
ivec2 texSize  = textureSize(u_sampler2D, 0);
vec2 texOffset = 1.0 / vec2(texSize.xy);
color_right    = texture(u_sampler2D, v_texCoord0 + texOffset * vec2(1.0, 0.0)).rgba;