尝试在 GLSL 中使用 texelFetch 从相邻片段获取数据
Trying to get data from neighbour fragments with texelFetch in GLSL
我的最终目标是围绕纹理创建轮廓。为此,我必须从相邻的片段中获取数据,并且我正在使用 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
, as you decided, or you use texture
:
如果你使用texelFetch
,纹素的地址是纹素行和列的索引。
我假设 v_texCoord0
是 (0.0, 1.0) 范围内的纹理坐标,而不是纹素的索引。
您必须将纹理坐标乘以纹理大小才能获得索引。纹理的大小可以通过 textureSize
:
获得
ivec2 texSize = textureSize(u_sampler2D, 0);
iVec2 texIndex = ivec2(v_texCoord0.xy * vec2(texSize.xy));
color_right = texelFetch(u_sampler2D, texIndex + ivec2(1, 0), 0).rgba;
另一种可能性是使用 texture
并计算 2 个纹素之间的偏移量:
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;
我的最终目标是围绕纹理创建轮廓。为此,我必须从相邻的片段中获取数据,并且我正在使用 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
, as you decided, or you use texture
:
如果你使用texelFetch
,纹素的地址是纹素行和列的索引。
我假设 v_texCoord0
是 (0.0, 1.0) 范围内的纹理坐标,而不是纹素的索引。
您必须将纹理坐标乘以纹理大小才能获得索引。纹理的大小可以通过 textureSize
:
ivec2 texSize = textureSize(u_sampler2D, 0);
iVec2 texIndex = ivec2(v_texCoord0.xy * vec2(texSize.xy));
color_right = texelFetch(u_sampler2D, texIndex + ivec2(1, 0), 0).rgba;
另一种可能性是使用 texture
并计算 2 个纹素之间的偏移量:
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;