纹理环绕 (Direct3D 9)

简而言之,纹理环绕改变了 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 位置重合)。 纹理支柱如下图所示。

图示为红色、绿色、蓝色和黄色各占 1/4 的支柱

如果未启用纹理环绕,则光栅器不会在所需的方向插入以便于生成可信的反射图像。 相反,支柱前部区域包含横向压缩的位于 u 坐标值 0.175 和 0.875 之间的纹素,并且通过纹理的中间位置。 无法产生环绕效果。

使用纹理环绕

若要启用纹理环绕,请调用 IDirect3DDevice9::SetRenderState 方法,如下面的代码示例所示。

d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);

IDirect3DDevice9::SetRenderState 接受的第一个参数是要设置的呈现状态。 通过D3DRS_WRAP7枚举值指定D3DRS_WRAP0之一,这些值指定要为其设置环绕的纹理级别。 通过第二个参数中的D3DWRAPCOORD_3标志指定D3DWRAPCOORD_0,以启用相应方向的纹理环绕,或将它们组合在一起以启用多个方向的环绕。 如果省略标志,则会禁用相应方向的纹理环绕。 若要禁用一组纹理坐标的纹理环绕,请将相应呈现状态的值设置为 0。

不要将纹理环绕与名称类似的纹理寻址模式混淆。 纹理环绕先于纹理寻址发生。 确保纹理环绕数据不含任何超出 [0.0, 1.0] 范围的纹理坐标,因为这会产生不确定的结果。 有关纹理寻址的详细信息,请参阅 direct3D 9) (纹理寻址模式

排量贴图包装

置换贴图中可插入平面填充引擎。 由于无法指定平面填充引擎的环绕模式,因此无法使用置换贴图实施纹理环绕。 应用程序可以使用顶点集,以便强行内插以在任意方向环绕。 应用程序亦可将要进行的插入指定为简单的线性插入。

Direct3D 纹理