当将纹理映射到几何时,可以在GL_NEAREST
和GL_LINEAR
之间选择过滤方法。
在the examples中,纹理坐标被纹理像素包围,如下所示:
并且解释了每种算法如何选择片段的颜色,例如根据与纹理坐标的距离对所有相邻的纹理像素进行线性插值。
每个纹理坐标实际上不是映射到屏幕上像素的片段位置吗?那么,这些坐标如何比本质上为像素且与片段大小相同的纹理像素更小?
A(2D)纹理可以视为函数t(u, v)
,其输出为“颜色”值。这是一个纯函数,因此对于相同的u
和v
值,它将返回相同的值。该值来自存储在内存中的查找表,该表由u
和v
索引,而不是通过某种计算。
纹理“映射”是将表面上的特定位置与纹理空间中的特定位置相关联的过程。也就是说,您将表面位置“映射”到纹理中的位置。这样,纹理函数t
的输入通常称为“纹理坐标”。一些表面位置可能映射到纹理上的相同位置,而某些纹理位置可能没有映射到它们的表面位置。这完全取决于映射
实际的纹理图像不是平滑函数;它是一个离散函数。它在纹理像素位置(0,0)有一个值,在(1,0)有另一个值,但是(0.5,0)的纹理值是不确定的。在图像空间中,u
和v
是整数。
您放大的部分纹理图片不正确。在像素之间“ 无值”,因为不可能在“像素之间”。整数行上的0和1之间没有数字。
但是,从表面到纹理函数的任何有用的映射都需要在连续空间而不是离散空间中进行。毕竟,每个片段不太可能准确落在映射到纹理内确切整数的位置上。毕竟,特别是在基于着色器的渲染中,着色器可以只是invent任意映射。 “映射”可以基于光的方向(投影纹理),片段相对于某个表面的高程或用户可能想要的任何东西。对于片段着色器,纹理只是可以评估以产生值的函数t(u, v)
。
因此,我们确实希望该功能在连续的空间中。
过滤的目的是通过在离散纹理像素之间的发明值来创建连续函数t
。这使您可以声明u
和v
是浮点值,而不是整数。我们还可以归一化纹理坐标,以使它们位于[0,1]范围内,而不是基于纹理的大小。
纹理过滤无法确定片段应为哪种颜色。这就是片段着色器的作用。但是,片段着色器可以在给定位置对纹理进行采样以获得颜色。它可以直接返回该颜色或可以对其进行处理(例如添加阴影等)
纹理过滤在采样时发生。纹理坐标不一定是完美的像素位置。例如,纹理可以是您在透视图中显示的3D模型的材料。然后,一个片段可能会覆盖一个以上的纹理像素,或者覆盖的范围可能较小。否则可能与纹理网格不对齐。在所有情况下,您都需要某种过滤。
对于以原始大小呈现精灵而没有任何变形的应用程序,由于从屏幕像素到纹理像素的1:1映射,通常不需要过滤。