GL_NEAREST如果具有mag 和 min 过滤的 2D 纹理(并且没有mipmapping,即仅存在 1 个级别)在 4 个纹素之间的中间精确采样,将返回什么值?
不幸的是,官方文档中没有关于此的任何注释。
更新:
实际上,整个十字架对我来说看起来很模棱两可。在下图中,我用x模棱两可的点(线)绘制,4 个纹素由 表示o:
o---x---o
| x |
x x x x x
| x |
o---x---o
那么如果纹理在x's 处采样,则返回哪些值?
GL_NEAREST如果具有mag 和 min 过滤的 2D 纹理(并且没有mipmapping,即仅存在 1 个级别)在 4 个纹素之间的中间精确采样,将返回什么值?
不幸的是,官方文档中没有关于此的任何注释。
更新:
实际上,整个十字架对我来说看起来很模棱两可。在下图中,我用x模棱两可的点(线)绘制,4 个纹素由 表示o:
o---x---o
| x |
x x x x x
| x |
o---x---o
那么如果纹理在x's 处采样,则返回哪些值?
如果我正确阅读了第 3.8.8 节(第 175 页),它看起来就像floor()在两个轴上都使用了。
o4--xA--o3
| x |
x x x x xB
| x |
o1--x---o2
所以所有的xes 都会 sample o1。除了xAandxB会采样o4and o2。
我阅读了所选答案中的规范部分,似乎所选答案是错误的。
根据使用 GL_NEAREST 时的规范,为指定的 (s,t,r) 返回的纹理值是具有以下条件的纹素之一:i=floor(u), j = floor(v)。请注意,纹素 (i,j) 的值是坐标 (u,v)=(i+0.5, j+0.5) 的值。见图。3.10 在第 160 页。
这归结为一个简单的规则,即给定一个样本点,使用最接近的纹素的值。在我们恰好在 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 坐标处对颜色编码的纹理进行采样,它的行为符合预期。