D3D12渲染技术之过滤

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/82878090

纹理贴图的元素是来自连续图像的离散颜色样本,它们不是带有区域的矩形。所以问题是:如果我们的纹理坐标(u,v)与其中一个纹理像素点不一致,会发生什么?这可能发生以下情况。假设放大场景中的墙壁,使墙壁覆盖整个屏幕,例如,假设显示器分辨率为1024×1024,墙壁的纹理分辨率为256×256,这说明纹理放大 - 我们试图用几个纹理像素覆盖整个屏幕像素,在我们的例子中,每个纹理像素点之间有四个像素,当顶点纹理坐标在三角形上插值时,每个像素将被赋予一对唯一的纹理坐标。因此,纹理坐标的像素如果与纹理像素点不一致,给定纹理像素处的颜色,我们可以使用插值来近似纹理像素之间的颜色。插值图形硬件支持两种方法:常量插值和线性插值,实际上,几乎总是使用线性插值。
下图说明了1D中的这些方法:假设我们有一个具有256个样本的1D纹理和一个插值纹理坐标u = 0.126484375。 该归一化纹理坐标指的是0.126484375×256 = 32.38纹理像素, 当然,这个值位于我们的两个纹理像素样本之间,因此我们必须使用插值来近似它。
在这里插入图片描述

在这里插入图片描述
(a)给定纹理像素点,我们构造一个分段常数函数来逼近纹理像素点之间的值; 这被称为最近邻点采样,因为使用了最近的纹理像素点的值。
(b)给定纹理像素点,我们构造一个分段线性函数来逼近纹理像素点之间的值。

二维线性插值称为双线性插值,如下图所示, 给定四个纹理像素之间的一对纹理坐标,我们在u方向上进行两次1D线性插值,然后在v方向上进行一次1D插值。
在这里插入图片描述
上图中, 这里我们有四个纹素点:cij,ci,j + 1,ci + 1,j和ci + 1,j + 1.,我们想要使用插值逼近位于这四个纹理像素点之间的c的颜色;在这个例子中,c位于cij右边0.75个单位,cij下面0.38个单位。 我们首先在前两种颜色之间进行一维线性插值以获得cT。 同样,我们在底部两种颜色之间进行一维线性插值以获得cB。 最后,我们在cT和cB之间进行一维线性插值得到c。
再看下图显示了常量插值和线性插值之间的差异,常量插值具有创建块状图像的特征, 线性插值更平滑,但仍然看起来不像我们有真实数据(例如,更高分辨率的纹理)而不是通过插值得到的数据。
在这里插入图片描述
我们放大具有板条纹理的立方体, 在左侧,我们使用常数插值,这会导致块状外观,因为插值函数具有不连续性,这使得变化突然而不是平滑。 在右侧,我们使用线性滤波,由于插值函数的连续性,导致更平滑的图像。

关于这个讨论需要注意的一点是,在3D程序中,虚拟相机可以自由移动, 从某些距离看,纹理看起来很棒,但是当眼睛离它们太近时会开始出现锯齿。 有些游戏会限制虚拟相机接近表面的距离,以避免出现锯齿。

在纹理化中,使用常量插值来寻找纹素之间的纹理坐标的纹理值也称为点过滤, 并且使用线性插值来查找纹理像素之间的纹理坐标的纹理值也称为线性过滤, 点和线性过滤是Direct3D使用的术语。

缩小

前面介绍了放大,下面介绍缩小,在缩小时,太多的纹理像素被映射到太少的像素。例如,考虑以下情况,我们有一个256×256的墙
,看着墙壁的眼睛一直向后移动,使墙壁越来越小,直到它只覆盖屏幕上的64×64像素,所以现在我们有256×256纹素被映射到64×64屏幕像素。在这种情况下,像素的纹理坐标通常仍然不与纹理贴图的任何纹理像素相吻合,因此恒定和线性插值滤镜仍然适用于缩小情况。但是,缩小可以做更多的事情,直观地说,应该采用256×256纹素的一种平均采样来将其降低到64×64,mipmapping技术以一些额外的内存为代价提供了有效的近似。在初始化时,通过对图像进行下采样以创建mipmap链来生成较小版本的纹理(请参见下图)。因此,平均是针对mipmap大小预先计算的,在运行时,图形硬件将根据程序员指定的mipmap设置执行两项不同的操作:
1、选择并使用与投影屏幕分辨率最匹配的mipmap级别进行纹理处理,根据需要应用常量或线性插值, 这称为mipmap的点过滤,因为它类似于常量插值 - 只需选择最近的mipmap级别并将其用于纹理。

2、选择最接近投影屏幕分辨率的两个最接近的mipmap级别进行纹理处理(一个大于屏幕分辨率,一个小于屏幕分辨率)。 接下来,对这两个mipmap级别应用常量或线性过滤,以为每个级别生成纹理颜色。 最后,在这两个纹理颜色结果之间进行插值, 这称为mipmap的线性过滤,因为它类似于线性插值 - 在两个最近的mipmap级别之间进行线性插值。

通过从mipmap链中选择最佳纹理级别的细节,可以大大减少缩小量。
在这里插入图片描述
一系列mipmap,每个连续的mipmap是每个维度的一半大小,前一个mipmap级别的详细信息低至1×1。
可以使用Photoshop DDS导出器插件或使用texconv程序创建mipmap, 这些程序使用下采样算法从基本图像数据生成较低的mipmap级别, 有时这些算法不会保留我们想要的细节,美工必须手动创建/编辑较低的mipmap级别以保留重要的细节。

各向异性过滤

可以使用的另一种类型的过滤器称为各向异性过滤, 该滤波器有助于减轻当多边形的法线矢量和相机的外观矢量之间的角度较宽时发生的失真(例如,当多边形与视图窗口正交时)。 这种滤波器是最昂贵的,但是可以用于校正失真伪像的成本, 下图显示了比较各向异性过滤和线性过滤的屏幕截图。
在这里插入图片描述
板条箱的顶面几乎与观察窗口正交, (左)使用线性过滤条件的顶部非常模糊, (右)各向异性过滤在从这个角度渲染板条顶面时做得更好。

阅读更多

扫码向博主提问

海洋_

博客专家

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 3D引擎架构
  • 服务器架构
  • GPU渲染
  • 客户端架构
  • 引擎优化
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页