纹理的各种过滤详解

本文深入探讨了Direct3D中的纹理过滤技术,包括最近点采样、线性过滤和各向异性过滤。介绍了各种过滤方法在游戏开发中的应用及其优缺点,特别强调了避免纹理像素边界采样导致的图像失真问题。同时,还提到了mipmap纹理技术及其在优化渲染速度和提高场景真实感方面的作用。
摘要由CSDN通过智能技术生成

         最近在研究Direct3D游戏的开发,真次让我对纹理过滤有了深刻的了解了! 希望和大家一起的分享!

 

         纹理过滤只要分为四种过滤方法

                  (1)---->最近点采样过滤

                    在程序中,我们并不是必须要使用纹理过滤。Direct3D可以被设置来计算纹理像素的地址,这个地址通常不是一个整数值,这时,可以简单的取一个与它最接近的整数地址来代替原地址,并使用这个整数地址上的纹理像素颜色。我们把这一过程称为最近点采样(nearest point sampling)。当纹理的大小与图元图象的大小差不多时,这种方法非常有效和快捷。如果大小不同,纹理就需要进行放大或缩小,这样,结果就会变得矮胖、变形或模糊。

  调用IDirect3DDevice3::SetTexture平台State方法可以来选择最近点采样方法,将它的第一个参数设置为纹理的整数平台索引号(0-7),第二个参数设置为D3DTEXTUREMAGFILTERD3DTEXTUREMIPFILTERD3DTEXTUREMIPFILTER,将第三个参数设置为D3DTFG_POINT(设置放大过滤时)、D3DTFN_POINT(缩小时)或D3DTFP_POINTmipmap时)。

  使用最近点采样是要特别小心,因为在两个纹理像素的分界线上进行采样时,可能产生图象失真(graphic artifacts)。在进行采样时,系统会选择这个采样纹理像素或者是那个采样纹理像素,在穿越分界线时,得到的结果将会产生很大的变化,也许会得到我们不想要的结果。(在使用线性过滤时,当纹理索引穿越两个纹理像素的边界时,最终的纹理像素将会是这两个纹理像素的融合结果。)

  当我们将一个很小的纹理映射到一个很大的多边形上——这被称为“放大(magnification)”——时,我们会看到这种效果。例如,当我们使用一个看起来象西洋跳棋盘一样的纹理时,最近顶采样会得到一个更大的西洋跳棋盘,并带有明显的边界;而采用线性过滤时,最后在多边形上,跳棋格颜色会平滑的进行过渡,不会有明显的边界出现。

  大多数时候,不使用最近点采样往往能得到最好的结果。并且在现在,大部分的硬件都是针对线性过滤进行优化的。如果你确实想得到最近顶采样那样的效果——比如要清晰的显示一些文本特征——那么就要尽量避免在纹理像素分界处进行采样,否则,就会产生图象的失真。下图中向我们展示了一种图象的失真:

                                                                          
                     

 

 

  注意上面的两个靠右的方格,它们就产生了失真。要避免这样的失真,我们首先要了解Direct3D最近点采样的规则。Direct3D是将一个浮点纹理坐标,范围为[0.0, 1.0](包括它们),映射到一个整数的纹理像素空间,范围为[0.5, n0.5]n是一个给定大小的纹理中纹理像素的数量。最终的纹理索引是最近的整数。这样的映射会导致在纹理像素分界处进行采样。

  下面我们来看一个例子,我们使用D3DTADDRESS_WRAP纹理寻址模式来对多边形进行渲染,使用Direct3D提供的映射对一个有4个纹理像素宽度的纹理进行映射,u纹理索引如下

 

注意图中的纹理坐标0.01.0,它们正好在两个纹理像素的分界处。更具最近点采样法的规则,纹理坐标的范围为[0.5, 40.5]4是纹理的宽度。这样,被采样的纹理像素就是第0个纹理像素,它的纹理索引值就为1.0。但是,如果纹理坐标只比1.0小一点,那么被采样的纹理像素就应该是第n个而不是第0个。

  这也就表示在将一个小的纹理使用最近点采样方法放大映射到屏幕空间时,会产生在纹理像素分界处采样的情况,这样就会产生失真。

  要将浮点纹理坐标映射到整数纹理像素上是很困难的,并且通常也没有必要这样做。大多数硬件在执行时使用一种迭代的方法来计算每个像素位置上的纹理坐标。这种方法往往会隐藏这些错误,因为它们在迭代过程中会逐渐积累起来。

  Direct3D参考光栅使用直接估计(direct-evaluation)的方法来计算每个像素位置上的纹理索引。与迭代法不同,直接估计过程中的一些错误会比较自由的表现出来。这样,在使用最近点采样时出现的错误就会比较明显。

  我们最好只在必需时再使用最近点采样法。在使用它时,最好能使纹理坐标明显的偏离纹理像素的分界处。

 

  (2)---->最近点采样过滤

 

4.2 线性纹理过滤

 

  Direct3D使用的线性过滤方法是双线性过滤(bilinear filtering)。和最近点采样一样,双线性过滤首先要计算一个纹理像素的地址,这个地址通常不是整数地址。然后,找到一个地址最接近的整数地址纹理像素。另外,Direct3D渲染模块还要计算与最近采样的点相邻的四个纹理像素的加权平均(weighted average)。

  可以调用IDirect3DDevice3::SetTexture平台State方法来选择双线性纹理过滤,并将第一个参数设置为纹理的整数索引号(0-7)</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值