正如您已经注意到的,texelFetch() 系列函数通过指定图像数据的实际整数纹素坐标来访问特定纹素。
相比之下,用于texture() 系列 GLSL 函数的纹理坐标与实际纹理坐标之间的映射要复杂一些。
首先,纹理坐标被定义为浮点数,从概念上讲,采样纹理表示评估 连续 1-、2- 或 3D- 函数,而不是访问离散数组。 过滤器模式当然定义了在纹理本身提供的数据点之间进行采样时获得的值。您应该知道,第一个区别是,在一般情况下,对纹理进行采样并不意味着处理单个纹素,而是使用多个纹素,以及过滤器模式(以及其他情况,如屏幕空间导数) tex coords) 定义了在操作过程中必须提取哪些纹素。
“普通”2D 纹理的 texcoord 定义为,(0,0) 定义左下 texel 的左下角 corner,而 (1,1) 定义右上角像素。请注意,此定义意味着当您想要在 0
如果指定了 [0,1] 范围之外的纹理坐标,则使用纹理的环绕模式 来确定如何将其映射到该范围。您基本上可以选择夹住它们,或重复纹理(镜像而不镜像)。
或者它是否更复杂并以某种方式在纹理属性中定义?
过滤器和环绕模式是采样器状态的一部分。 GLES 3 支持Sampler Objects,它允许您指定独立于纹理对象的采样器状态。在传统的 GL 中,纹理对象确实包含采样器状态。采样器对象允许您选择性地覆盖该状态。
Here 它声明“纹理坐标可以被归一化或在纹素空间中。”但我持怀疑态度,因为我没有看到任何地方可以将纹理设置为标准化。
嗯,这是指桌面 GL,而不是 GLES 3。您提供的链接实际上在您引用的段落之后解释了这一点。矩形纹理使用映射,其中 [0,width) x [0,height) 表示纹理坐标中的整个图像,而不是标准化的 [0,1] 范围。但是在 ES3 中,不支持矩形纹理,所以这里无关紧要。