1、 为什么在纹理采样时需要texture filter(纹理过滤)。
我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixel不一定对应texture上的采样中心texel),大小也不一定一至。当纹理大于三维图形表面时,导至一个像素被映射到许多纹理像素上;当维理小于三维图形表面时,许多个象素都映射到同一纹理。
当这些情况发生时,贴图就会变得模糊或发生错位,马赛克。要解决此类问题,必须通过技术平滑texel和pixel之间的对应。这种技术就是纹理滤波。
不同的过滤模式,计算复杂度不一样,会得到不同的效果。过滤模式由简单到复杂包括:Nearest Point Sampling(最近点采样),Bilinear(双线性过滤)、Trilinear(三线性过滤)、Anisotropic Filtering(各向异性过滤)。
在了解这些之前,有必要了解什么是MipMap和什么时各向同性,各向异性。
2、 什么是MipMap?
Mipmap由Lance Williams 在1983的一篇文章“Pyramidal parametrics”中提出。Wiki中有很详细的介绍( http://en.wikipedia.org/wiki/Mipmap ) . 比如一张256X256的图,在长和宽方向每次减少一倍,生成:128X128,64X64,32X32,16X16,8X8,4X4,2X2,1X1,八张图,组成MipMap,如下图示。
Mipmap早已被硬件支持,硬件会自动为创建的Texture生成mipmap的各级。在D3D的API:CreateTexture中有一个参数levels,就是用于指定生成mipmap到哪个级别,当不指定时就一直生成到1X1。
3、 什么是各向同性和各向异性?
当需要贴图的三维表面平行于屏幕(viewport),则是各向同性的。当要贴图的三维表面与屏幕有一定角度的倾斜,则是各向异性的。
也可以这样理解,当一个texture贴到三维表面上从Camera看来没有变形,投射到屏幕空间中后U方向和V方向比例仍然是一样的,便可以理解成各向同性。反之则认为是各向异性。
4、 Nearest Point Sampling(最近点采样)
这个最简单,每个像素的纹理坐标,并不是刚好对应Texture上的一个采样点texel,怎么办呢?最近点采样取最接近的texel进行采样。
当纹理的大小与贴图的三维图形的大小差不多时,这种方法非常有效和快捷。如果大小不同,纹理就需要进行放大或缩小,这样,结果就会变得矮胖、变形或模糊。
5、 Bilinear(双线性过滤)
双线性过滤以pixel对应的纹理坐标为中心,采该纹理坐标周围4个texel的像素,再取平均,以平均值作为采样值。
双线性过滤像素之间的过渡更加平滑,但是它只作用于一个MipMap Level,它选取texel和pixel之间大小最接近的那一层MipMap进行采样。当和pixel大小匹配的texel大小在两层Mipmap level之间时,双线性过滤在有些情况效果就不太好。于是就有了三线性过滤。
6、 Trilinear(三线性过滤)
三线性过滤以双线性过滤为基础。会对pixel大小与texel大小最接近的两层Mipmap level分别进行双线性过滤,然后再对两层得到的结果进生线性插值。
三线性过滤在一般情况下效果非常理想了。但是到目前为止,我们均是假设是texture投射到屏幕空间是各向同性的。但是当各向异性的情况时,效果仍然不理想,于是产生了Anisotropic Filtering(各向异性过滤)。
7、 Anisotropic Filtering(各向异性过滤)
先看效果,左边的图采用三线性过滤,右边的图采用各向异性过滤。
各向同性的过滤在采样的时候,是对正方形区域里行采样。各向异性过滤把纹理与屏幕空间的角度这个因素考虑时去。简单地说,它会考滤一个pixel(x:y=1:1)对应到纹理空间中在u和v方向上u和v的比例关系,当u:v不是1:1时,将会按比例在各方向上采样不同数量的点来计算最终的结果(这时采样就有可能是长方形区域)。
我们一般指的Anisotropic Filtering(AF)均是基于三线过滤的Anisotropic Filtering,因此当u:v不为1:1时,则Anisotropic Filtering比Trilinear需要采样更多的点,具体要采多少,取决于是多少X的AF,现在的显卡最多技持到16X AF。
当开启16X AF的时候,硬件并不是对所有的texture采样都用16X AF,而是需要先计算屏幕空间与纹理空间的夹角(量化后便是上面所说的u:v),只有当夹角大到需要16X时,才会真正使用16X.
如果想了解AF的实现原理,可以查阅此篇Paper: “Implementing an anisotropic texture filter”. 现在AF都是硬件实现,因此只有少数人才清楚AF就尽是怎样实现了(其实细节我也没搞清楚),其实完全可以由Pixel Shader来实现AF,当然性能和由硬件做是没得比的。
8、 各过滤模式性能比较。
下表是各种过滤模式采一个pixel需要sample的次数:
Sample Number
Nearest Point Sampling
1
Bilinear
4
Trilinear
8
Anisotropic Filtering 4X
32
Anisotropic Filtering 16X
128
Anisotropic Filtering 16X效果最好,但是显卡Performance会下降很多,当然也是测试你手中显卡Texture Unit的好方法。如果你觉得你的显卡够牛,那么就把AA和AF都打到最高再试试吧:)
分享到:
相关推荐
纹理过滤在3D图形中起着至关重要的作用,它主要分为几种类型:点采样(Point Sampling)、线性过滤(Bilinear Filtering)、三线性过滤(Trilinear Filtering)和各向异性过滤(Anisotropic Filtering)。...
2. **Bilinear Filtering(双线性过滤)**:在源纹理的四个相邻像素上进行插值计算,得到新的颜色,能有效减少锯齿现象,但可能产生轻微模糊。 3. **Trilinear Filtering(三线性过滤)**:结合了双线性过滤和MIP...
在OpenGL中,我们可以通过glTexParameter函数来调整纹理过滤器。例如,设置GL_TEXTURE_MIN_FILTER和GL_TEXTURE_MAG_FILTER两个参数可以分别控制纹理缩小时和放大时的过滤方式。线性滤波常用于这两个参数,以确保无论...
1. **线性过滤(Linear Filtering)**:这是最基本的纹理过滤方法,分为三类:点采样(Point Sampling)、双线性过滤(Bilinear Filtering)和三线性过滤(Trilinear Filtering)。点采样简单地选择最接近像素中心的...
除了这两种基础过滤方式,还有更高级的纹理过滤技术,如三线性过滤(Trilinear Filtering)和各向异性过滤(Anisotropic Filtering)。三线性过滤结合了双线性过滤和MIP映射(多分辨率纹理)的概念,确保在不同距离...
在“opengles图像处理之平滑过滤”这个主题中,我们将深入探讨OpenGL ES在图像处理中如何实现平滑过滤,也就是常说的纹理过滤(Texture Filtering)。 纹理过滤是一种提高图像质量的技术,特别是在纹理缩放或视距较...
本篇将深入探讨纹理过滤器、多级纹理和寻址模式这三大关键知识点,并结合C++源代码进行解析。 首先,纹理过滤器在Direct9.0中用于处理纹理采样时的精度问题。当纹理被放大或缩小以适应模型表面时,如果不进行适当的...
常见的过滤模式有最近邻插值(Nearest Neighbor)、双线性过滤(Bilinear Filtering)和三线性过滤(Trilinear Filtering)。近邻插值会产生像素化的效果,而双线性和三线性过滤则提供更平滑的过渡。 3. 混合模式:...
包括最近邻过滤(Nearest Neighbor)、双线性过滤(Bilinear)、三线性过滤(Trilinear)和各向异性过滤(Anisotropic Filtering)。这些过滤方式可以优化纹理显示质量,特别是在物体表面角度变化大或者纹理被拉伸时...
3. **纹理单元**:OpenGL ES可以同时处理多个纹理,每个被激活的纹理单元都有自己的纹理坐标和状态设置,如纹理过滤和重复模式。 4. **纹理过滤**:当纹理被缩放或拉伸时,为了保持图像质量,会使用纹理过滤。主要...
书中会详细阐述不同的采样技术,如最近邻采样(Nearest Neighbor)、双线性过滤(Bilinear Filtering)和三线性过滤(Trilinear Filtering),以及它们对图像质量和性能的影响。此外,还会讨论反走样(Antialiasing...
3. **纹理过滤**:由于纹理图像可能比模型表面大或小,OpenGL 提供了多种纹理过滤方法,如最近邻插值(Nearest Neighbor)、双线性过滤(Bilinear Filtering)和三线性过滤(Trilinear Filtering),以平滑纹理的...
内容保持操纵是指那些在不损害图像基本真实性的情况下的图像处理技术,如过滤、重采样、压缩和对比度增强等。尽管这些操作一般不会损害图像的真伪,但其盲目检测在取证上是非常重要的。 根据提供的文件信息,本文...
纹理过滤则关乎如何在屏幕上呈现纹理。主要有以下四种过滤方式: 1. **点采样(Point Sampling)**:也称为最近邻插值,每个像素对应纹理上的一个点,无平滑过渡,可能会导致锯齿状边缘。 2. **线性采样(Bilinear ...
在压缩包中的“lesson22”文件可能包含了实现这些技术的源代码示例,可能包括纹理加载、纹理坐标设置、滤波模式选择、凹凸纹理计算以及多重纹理的混合等关键步骤。通过分析和学习这些代码,开发者可以深入理解OpenGL...
2. **过滤**:在纹理缩放时,为了防止图像失真和锯齿,Direct3D提供了多种过滤模式,如最近邻过滤(Nearest Neighbor)、双线性过滤(Bilinear Filter)和三线性过滤(Trilinear Filter)。双线性过滤在缩放纹理时...
3. **纹理过滤**:为了提高渲染质量和性能,DirectX支持多种纹理过滤技术,如最近邻(Nearest Neighbor)、双线性(Bilinear)、三线性(Trilinear)和各向异性(Anisotropic)过滤。源代码中可能会涉及设置和优化...
- 最近邻过滤(Nearest Neighbor Filtering)是最简单的纹理过滤方式,它会选取最接近的纹理像素颜色。 - 双线性过滤(Bilinear Filtering)通过线性插值在四个最近的纹理像素之间进行颜色混合,提供更平滑的过渡...
为了提高纹理的质量和性能,Java3D提供了纹理过滤选项,如双线性过滤(bilinear filtering)和三线性过滤(trilinear filtering),这些技术可以在缩放纹理时减少锯齿效应。此外,纹理重复(texture repeating)是一...
在嵌入式系统和图形处理领域,"DMA2D_bilinear_resize_resize_bilinear_dma_" 这个标题暗示了我们正在讨论一个与直接存储器访问(DMA)2D引擎相关的技术,特别是涉及到双线性插值缩放(bilinear resizing)的实现。...