如果具有 GL_NEAREST
mag 和最小滤波(并且没有 mipmapping,即仅存在 1 级(的 2D 纹理正好在 4 个纹素之间的中间采样,将返回什么值?
不幸的是,官方文档中没有对此进行任何说明。
更新:
实际上,整个十字架对我来说看起来很模棱两可。在下图中,我用x
绘制了不明确的点(线(,4 个纹素用 o
表示:
o---x---o
| x |
x x x x x
| x |
o---x---o
那么,如果在x
处对纹理进行采样,则返回哪些值?
正确阅读了第 3.8.8 节(第 175 页(,看起来两个轴都使用了floor()
。
o4--xA--o3
| x |
x x x x xB
| x |
o1--x---o2
所以所有的x
都会对o1
进行采样。 除了xA
和xB
会采样o4
和o2
。
我阅读了所选答案中的规范部分,似乎所选答案是错误的。
根据使用 GL_NEAREST 时的规范,为指定的 (s,t,r( 返回的纹理值是具有以下特征的纹素之一:i=floor(u(,j = floor(v(。请注意,纹素 (i,j( 的值是坐标为 (u,v(=(i+0.5, j+0.5( 的值。参见第160页的图3.10。
这归结为一个简单的规则,即给定一个采样点,使用最接近的纹素的值。如果我们在 2 个纹素中心之间精确采样,则使用右侧或顶部的那个。例如,如果我们想在 u=1 处采样(纹素 0 和 1 中心之间的距离相等(,那么我们将选择 i=floor(1(=1,即右侧的纹素。纹素的中心在 u=1.5。
所以这就是将要发生的事情:
o4----x3----o3
| x3 |
x4 x4 x3 x3 x3
| x2 |
o1----x2----o2
我还使用 OpenGL ES 执行了一项测试,方法是从片段着色器中以预定义的 s,t 坐标对颜色编码纹理进行采样,它的行为符合预期。