You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:06:22