为什么我们需要OpenGL中的纹理过滤?

为什么我们需要OpenGL中的纹理过滤?,opengl,textures,fragment-shader,texture-mapping,Opengl,Textures,Fragment Shader,Texture Mapping,将纹理映射到几何体时,我们可以在GL\u NEAREST和GL\u LINEAR之间选择过滤方法 在中,纹理坐标由texel包围,如下所示: 并解释了每种算法如何选择片段的颜色,例如,基于与纹理坐标的距离对所有相邻的纹理进行线性插值 不是每个纹理坐标本质上都是映射到屏幕上像素的片段位置吗?因此,这些坐标如何小于基本上是像素且与片段大小相同的texel?纹理过滤并不决定片段应该是什么颜色。这就是片段着色器所做的。但是,片段着色器可以在给定位置对纹理进行采样以获得颜色。它可以直接返回该颜色,也可以

将纹理映射到几何体时,我们可以在
GL\u NEAREST
GL\u LINEAR
之间选择过滤方法

在中,纹理坐标由texel包围,如下所示:

并解释了每种算法如何选择片段的颜色,例如,基于与纹理坐标的距离对所有相邻的纹理进行线性插值


不是每个纹理坐标本质上都是映射到屏幕上像素的片段位置吗?因此,这些坐标如何小于基本上是像素且与片段大小相同的texel?

纹理过滤并不决定片段应该是什么颜色。这就是片段着色器所做的。但是,片段着色器可以在给定位置对纹理进行采样以获得颜色。它可以直接返回该颜色,也可以对其进行处理(例如添加阴影等)

纹理过滤在采样时发生。纹理坐标不一定是完美的像素位置。例如,纹理可以是在透视视图中显示的三维模型的材质。然后,一个碎片可以覆盖多个纹理,也可以覆盖较少的纹理。或者它可能未与纹理网格对齐。在所有情况下,您都需要某种过滤

对于以原始大小渲染精灵而不发生任何变形的应用程序,通常不需要过滤,因为从屏幕像素到纹理的比例为1:1。

a(2D)纹理可以视为函数
t(u,v)
,其输出为“颜色”值。这是一个纯函数,因此它将为相同的
u
v
值返回相同的值。该值来自存储在内存中的查找表,由
u
v
索引,而不是通过某种计算

纹理“映射”是将曲面上的特定位置与纹理空间中的特定位置相关联的过程。也就是说,将曲面位置“映射”到纹理中的某个位置。因此,纹理函数
t
的输入通常称为“纹理坐标”。某些曲面位置可能映射到纹理上的同一位置,而某些纹理位置可能没有映射到它们的曲面位置。这完全取决于映射

实际纹理图像不是平滑函数;它是一个离散函数。它在纹理位置(0,0)处有一个值,在(1,0)处有另一个值,但在(0.5,0)处纹理的值未定义。在图像空间中,
u
v
是整数

您放大部分纹理的图片不正确。texel之间没有值,因为“texel之间”是不可能的。整数行上没有介于0和1之间的数字

但是,从曲面到纹理函数的任何有用映射都需要在连续空间中进行,而不是在离散空间中进行。毕竟,不太可能每个碎片都精确地落在纹理中映射为精确整数的位置上。毕竟,特别是在基于着色器的渲染中,着色器可以任意创建贴图。“映射”可以基于光的方向(投影纹理)、碎片相对于某个曲面的高度,或者用户可能想要的任何东西。对于片段着色器,纹理只是一个函数
t(u,v)
,可以对其求值以生成值

所以我们真的希望函数在一个连续的空间中


过滤的目的是通过在离散纹理之间创建值来创建连续函数
t
。这允许您声明
u
v
是浮点值,而不是整数。我们还可以规范化纹理坐标,使其位于[0,1]范围内,而不是基于纹理的大小。

通常3D屏幕像素不会映射到单个testure的像素透视视图中,甚至会扭曲平面。或者想象一下球体。因此,屏幕像素不会正好击中一个texel,您需要一种方法在纹理上的某个点使用分数坐标生成一些颜色,因此需要进行过滤。