DirectX11-纹理采样

纹理采样(过滤器)

一、倍增过滤(少的纹理元素映射多的像素)       

        纹理贴图元素应该被视为在一个连续图像上的离散颜色采样;不应该被视为矩形区域。那么问题是:当我们指定的纹理坐标(u,v)与任何一个纹理元素点都不对应时会产生什么结果?这一问题会发生在如下情景中:当观察点离场景中的一面墙很近时,墙会被放大,以至于会盖住整个屏幕。如果显示器的分辨率为 1024×1024,墙体纹理的分辨率为 256×256,那么就会出现倍增(magnification)问题——我们将要用很少的纹理元素来覆盖很多的像素。在本例中,每个纹理元素要覆盖 4 个像素。当顶点纹理坐标在三角形表面上进行插值时,每个像素都会得到一对唯一的纹理坐标。所以,像素的纹理坐标不会与任何一个纹理元素点对
应。 我们可以使用插值方法来估算纹理元素之间的颜色。图形硬件提供了两种插值方法:常量插值和线性插值。线性插值是我们最常用的插值方法。
        图8.5 说明了在 1D 空间中的插值方法:假设有一个包含 256 个采样点的 1D 纹理以及一个插值纹理坐标 u =0.126484375。那该纹理坐标对应的纹理元素为 0.126484375×256 =32.38。当然,这个值位于两个纹理采样点之间,我们必须使用插值来估算它。

       图 8.5 (a) 给出纹理元素点,我们构造一个分段常量函数来估算纹理元素点之间的值;这种方法有时也称为最近邻接点采样(nearest neighbor point sampling),因为它总是用最近的纹理元素点的值作为采样结果。(b) 给出纹理元素点,我们构造一个分段线性函数来估算纹理元素点之间的值。

        2D 线性插值也称为双线性插值(bilinear interpolation),如图 8.6 所示。给出一对位于 4个纹理元素之间的纹理坐标,我们在 u 方向上进行两次 1D 线性插值,然后在 v 方向上进行一次 1D 线性插值。

       图 8.6 这里有 4 个纹理元素点。我们想要估算 c 点的颜色,它位于这 4 个纹理元素点之间 。 在本例中 ,c 位于 c ij 右侧 0.75 单位 、c ij 下方 0.38 单位处 。 我们先在上面的两个颜色之间进行 1D 线性插值得到 c T 。 然后 , 在下面的两个颜色之间进行 1D 线性插值得到 c B 。最后,在 c T 和 和 c B 之间进行线性插值得到 c 。

        图 8.7 说明了常量插值和线性插值之间的区别。可以看到,常量插值会使图像出现明显的块状。而线性插值较为平滑,但是与真实数据(例如,一幅高分辨率的纹理)相比,通过插值得到的衍生数据仍然不够理想。

       图 8.7 我们在一个立方体放大一幅板条箱纹理,使倍增问题出现。左图使用常量插值,可以看到它产生了明显的斑块 ; 这很容易理解 , 因为插值函数是离散的(图 8.5a), 它所形成的颜色过渡显得生硬而不平滑。右图使用线性插值,由于插值函数是连续的,所以它产生的图像较为平滑。

       需要强调的是,由于在交互式 3D 程序中观察点的位置可以自由移动,所以我们对于倍增问题没有一种非常彻底的解决办法。在一定距离内,纹理可以有较好的效果,但是当观察点与物体之间的距离越来越近时,效果会急转直下。使用更高分辨率的纹理可以缓解一问题。
       注意:在纹理映射的环境下,使用常量插值来求解纹理元素之间的颜色值的过程也称为点过滤(point filtering),使用线性插值来求解纹理元素之间的颜色值的过程也称为线性过滤(linear filtering)。点过滤和线性过滤是 Direct3D 使用的术语。

二、缩减过滤(多的纹理元素映射少的像素)

        缩减(minification)与倍增的情况恰好相反。在缩减中,较多的纹理元素会被映射为较少的像素。例如,考虑下面的情景:我们将一幅 256×256 的纹理映射到墙体上。然后把观察点对准墙体,并向后移动观察点,使墙体逐渐变小,直到墙体在屏幕上只占 64×64 的像素区域为止。现在,我们要把 256×256 个纹理元素映射为 64×64 个屏幕像素。在这一情景中,像素的纹理坐标不会与纹理贴图中的任何一个纹理元素对应。常量和线性插值过滤器仍然适用于缩减情况。不过,缩减的处理工作稍多一些。简单的讲,我们要把 256×256 个纹理元素均匀地缩减为 64×64 个纹理元素。多级渐近贴图映射(mipmapping)为这一工作提供了一种高效的估值手段,只是要额外占用一些内存。在初始化时(或创建资源时),通过对图像进行降阶采样生成纹理的多个缩略版本来创建多级渐近纹理链(mipmap chain,参见图 8.8)。求平均值的工作是根据多级渐近贴图的大小提前计算出来的。在运行时,图形硬件会根据程序员指定的多级渐近贴图参数执行两种不同的操作:
        1.为纹理映射挑选一个与屏幕几何体分辨率最匹配的多级渐近纹理层,根据需要在多级渐近纹理层上使用常量插值或线性插值。这种用于多级渐近纹理的操作称为点过滤(pointfiltering),因为它与常量插值很像——它只为纹理映射挑选一个最接近的多级渐近纹理层。

        2.为纹理映射挑选两个与屏幕几何体分辨率最匹配的多级渐近纹理层(其中,一个比屏幕几何体分辨率大一些,另一个比屏幕几何体分辨率小一些)。然后,在这两个多级渐近纹理层上使用常量插值或线性插值,分别取出一个纹理颜色。最后,在这两个纹理颜色之间进行插值。这种用于多级渐近纹理的操作称为线性过滤(linear filtering),因为它与线性插值很像——它在两个最匹配的多级渐近纹理层之间进行线性插值。

       图 8.8 多级渐近纹理链 ; 每个后续多级渐近纹理层的尺寸都是前一层的 1/2 , 纹理层的下限尺寸是 1 ×1

       通过在多级渐近纹理链中选择最佳纹理层,可以使缩减操作的总开销降至最低。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值