如何用texelFetch()获取sampler1D元素?采样失效与存储方式咨询
sampler1D纹理使用与高斯模糊权重失效问题解答
1. 用texelFetch()获取sampler1D纹理元素的方法
texelFetch()是直接通过整数索引读取纹素的GLSL函数,针对sampler1D的调用格式为:
gvec4 texelFetch(sampler1D sampler, int index, int lod);
参数说明:
sampler:目标sampler1D对象index:1D纹理的整数索引,范围是0到textureSize(sampler, lod)-1,超出范围的行为由纹理环绕模式控制lod:多级渐远纹理层级,一般传0即可访问最精细的纹理层级
比如texelFetch(BlurFilterTex, 0, 0)就是读取该1D纹理第0个纹素的RGBA值。
2. sampler1D数据存储逻辑与你的权重失效问题
sampler1D的存储方式
sampler1D将数据以一维线性数组形式存储,纹素索引从0开始,依次递增到纹理宽度减1。比如宽度为N的sampler1D,有效索引范围是0 ~ N-1,每个索引对应一个纹素的颜色/数据值。
代码中的问题分析
你代码里的循环部分存在索引计算错误:
sum += texelFetchOffset(ThresholdImageTex, pix, 0, ivec2(i,0)) * texelFetch(BlurFilterTex, i*TexSize, 0).r;
这里的i*TexSize完全错误:
TexSize是1D纹理的宽度,假设你的高斯滤波器宽度为5,TexSize就是5- 当i=1时,索引变为5,超出了纹理的有效索引范围(最大是4),此时会触发纹理环绕模式(默认是重复),导致你读取的是索引0的权重,而非第i个权重,这就是模糊未生效的核心原因。
修复代码
直接用i作为1D纹理的索引即可,假设你的高斯核权重是按[中心权重, 左/右第1个权重, 左/右第2个权重,...]的顺序存储,修改后的循环代码如下:
for( int i = 1; i < BlurFilterWidth; i++){ sum += texelFetchOffset(ThresholdImageTex, pix, 0, ivec2(i,0)) * texelFetch(BlurFilterTex, i, 0).r; sum += texelFetchOffset(ThresholdImageTex, pix, 0, ivec2(-i,0)) * texelFetch(BlurFilterTex, i, 0).r; }
额外注意:
- 确保
BlurFilterWidth的值不超过TexSize,避免再次出现越界访问 - 确认1D纹理的权重存储顺序和模糊逻辑匹配,比如中心权重放在索引0,偏移权重依次放在后续索引位置
内容的提问来源于stack exchange,提问作者Yifan Lu
相关产品推荐
相关产品推荐

