全部专题

texture2D、texture 和 texelFetch 该用哪个?

ES 1.00 用 texture2D 做带过滤的二维采样;ES 3.00 使用 texture,并按采样器类型选择对应版本。texelFetch 则在指定 mip 层级按整数纹素坐标读取,不做双线性过滤。图片通常需要插值,而细胞状态和精确数据查询往往不能混合相邻数值。

先固定问题

texture2D 是 ES 1.00 的二维过滤采样名字;ES 3.00 用 texture 根据采样器类型选择重载。texelFetch 则读取指定 mip 层级的整数纹素坐标,不做双线性过滤。选择取决于数据的语义:图片往往希望平滑采样,细胞状态或精确数据查询则不希望在邻居之间混合。

关键代码

// GLSL ES 1.00:
vec4 a=texture2D(image,uv);
// GLSL ES 3.00, compile separately:
vec4 b=texture(image,uv);
ivec2 size=textureSize(image,0);
ivec2 pixel=clamp(ivec2(uv*vec2(size)),ivec2(0),size-1);
vec4 c=texelFetch(image,pixel,0);

按顺序验证

在像素化案例里先量化 UV 再用过滤采样;到 texelFetch 手册页观察整数坐标读数。把同一坐标从纹素中心移到边界,检查过滤差异。

适用范围和常见错误

这些语句属于两个版本,不能把示例注释当成自动兼容层。texelFetch 的越界坐标也不会替你按纹理 wrap 设置安全环绕。

继续实验

参考

官方文档

运行相关示例