纹理包裹

纹理环绕更改了 Direct3D 使用为每个顶点指定的纹理坐标来光栅化纹理多边形的基本方法。 对多边形进行光栅化时,系统在每个多边形顶点的纹理坐标之间进行插值,以确定应为多边形的每个像素选择使用的纹素。 常规情况下,系统将纹理视为一个 2D 平面,以从纹理中的 A 点到 B 点的最短路径来插入新的纹素。如果点 A 表示 u、v 位置 (0.8, 0.1),而点 B 是 (0.1, 0.1),则内插线的形状如下图所示。

两个点之间的插值线图

请注意,在此示意图中,A 和 B 之间的最短距离大致经过纹理的中间部分。 启用 u 纹理或 v 纹理坐标环绕会改变 Direct3D 对于在 u 方向和 v 方向上纹理坐标之间的最短路径的感知方式。 根据定义,纹理环绕会导致光栅器在纹理坐标集之间走最短路径,假设 0.0 和 1.0 是重合的。 最后一点是棘手的部分:可以想象,在一个方向启用纹理包装会导致系统将纹理视为它被包裹在一个圆柱体周围。 例如,请考虑下图。

纹理和两个点围绕柱形的图示

上图显示了在 u 方向中环绕如何影响系统内插纹理坐标的方式。 使用与普通纹理或非环绕纹理示例中相同的点,可以看到 A 和 B 点之间的最短路线不再穿过纹理的中间;它现在位于0.0和1.0重合的边界上。 在 v 方向的环绕是类似的,只是它将纹理缠绕在横放的圆柱体周围。 在 u 方向和 v 方向的缠绕过程更为复杂。 在这种情况下,可以将纹理设想为圆环或甜甜圈。

纹理包装最常见的实用应用程序是执行环境映射。 通常,使用环境地图纹理的对象显得反射性很强,呈现出场景中物体周围环境的镜像。 为了便于讨论,想象一个房间,有四面墙,每面墙上都涂有字母 R、G、B 和 Y 及其相应的颜色:红色、绿色、蓝色和黄色。 此类简单房间的环境映射可能如下图所示。

红色、绿色、蓝色和黄色垂直条纹的插图

想象一下,房间的天花板被一个完全反射的四面柱子支撑着。 将环境贴图纹理映射到柱子很简单:使柱子看起来好像它反映了字母和颜色并不容易。 下图显示了柱形的线框,其中列出了顶部顶点附近的适用纹理坐标。 用虚线表示包装将跨过纹理边缘的接缝。

一条将矩形平分的虚线的关系图

当在u方向启用环绕后,带纹理的柱体会适当地显示环境地图中的颜色和符号,并且在纹理前面的接缝处,栅格化器能够正确地选择在纹理坐标间的最短路径,假设u坐标0.0和1.0共享同一位置。 纹理柱形如下图所示。

由红色、绿色、蓝色和黄色象限组成的柱形图示

如果未启用纹理包裹,光栅器将不会在生成可信反射图像所需的方向上进行插值。 相反,柱子前部的区域包含 u 坐标 0.175 和 0.875 之间的纹素水平压缩版本,因为它们通过纹理的中心。 包裹效果被破坏。

不要将纹理包装与类似命名的纹理寻址模式混淆。 纹理包装在纹理寻址之前执行。 请确保纹理包装数据不包含 [0.0, 1.0] 范围之外的任何纹理坐标,因为这会产生未定义的结果。 有关纹理寻址的详细信息,请参阅 纹理寻址模式

排量地图包装

排量图由分割引擎内插。 由于无法为镶嵌引擎指定包裹模式,因此不能使用位移贴图进行纹理包裹。 应用程序可以使用一组顶点,强制使内插在任何方向上环绕。 应用程序还可以指定进行简单线性插值。

纹理