具有GL_NEAREST过滤的样本之间的中间位置:它返回了什么?

时间:2013-07-16 16:51:29

标签: opengl glsl shader textures interpolation

如果具有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处采样纹理,会返回哪些值?

2 个答案:

答案 0 :(得分:2)

如果我正确地阅读Section 3.8.8 (page 175),则两个轴上都会使用floor()

o4--xA--o3
|   x   |
x x x x xB
|   x   |
o1--x---o2

因此,所有x es都会对o1进行抽样。除了xAxB之外,它会对o4o2进行抽样。

答案 1 :(得分:1)

我在selected answer中阅读了规范的各个部分,似乎选择的答案是错误的。

根据使用GL_NEAREST时的规范,为指定(s,t,r)返回的纹理值是具有以下内容的纹素之一:i = floor(u),j = floor(v)。 注意,texel(i,j)的值是坐标(u,v)=(i + 0.5,j + 0.5)的值。见图。 3.10,第160页。

这归结为给定样本点的简单规则,使用最接近的纹素的值。在我们准确地在2个纹素中心之间进行采样的情况下,使用右侧或顶部的那个。例如,如果我们想要在u = 1(在texel 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坐标处对颜色编码纹理进行采样,并且其表现符合预期。