纹理坐标 (Direct3D 9)

大多数纹理(如位图)都是颜色值的二维数组。 立方环境地图纹理是一个例外。 有关详细信息,请参阅 立方环境映射(Direct3D 9)。 单个颜色值称为纹理元素或纹素。 每个纹素在纹理中都有一个唯一的地址。 该地址可视为列号和行号,在下图中分别标记你和 v。

作为列和行号的纹素地址的 插图

纹理坐标位于纹理空间中。 也就是说,它们相对于纹理中的位置(0,0)。 当纹理应用于 3D 空间中的基元时,其纹素地址必须映射到对象坐标中。 然后,它们必须转换为屏幕坐标或像素位置。

将纹素映射到屏幕空间

Direct3D 将纹理空间中的纹素直接映射到屏幕空间中的像素,跳过中间步骤以提高效率。 此映射过程实际上是反向映射。 也就是说,对于屏幕空间中的每个像素,将计算纹理空间中的相应纹素位置。 对点或周围处的纹理颜色进行采样。 采样过程称为纹理筛选。 有关详细信息,请参阅 纹理筛选(Direct3D 9)

纹理中的每个纹素都可以由纹理坐标指定。 但是,为了将纹素映射到基元,Direct3D 需要所有纹理中所有纹素的统一地址范围。 因此,它使用泛型寻址方案,其中所有纹素地址都在 0.0 到 1.0(含 1.0)范围内。 Direct3D 应用程序根据你、v 值指定纹理坐标,非常类似于 2D 笛卡尔坐标,以 x、y 坐标为单位指定。 从技术上看,系统实际上可以在 0.0 和 1.0 范围内处理纹理坐标,并使用为纹理寻址设置的参数来处理纹理坐标。 有关详细信息,请参阅 纹理寻址模式(Direct3D 9)

结果是,相同的纹理地址可以映射到不同纹理中的不同纹素坐标。 在下图中,纹理地址为 (0.5,1.0)。 但是,由于纹理大小不同,纹理地址映射到不同的纹素。 左侧纹理 1 为 5x5。 纹理地址(0.5,1.0)映射到纹素(2,4)。 右侧的纹理 2 为 7x7。 纹理地址(0.5,1.0)映射到纹素(3,6)。

同一纹理地址映射到不同纹理上的不同纹素的 图示

下图显示了纹素映射过程的简化版本。 当然,此示例非常简单。 有关详细信息,请参阅 将纹素直接映射到像素(Direct3D 9)

映射到对象空间 像素(颜色正方形)的图示

在此示例中,图左侧显示的像素被理想化为一种颜色的正方形。 像素四角的地址将映射到对象空间中的 3D 基元中。 由于 3D 空间中基元的形状以及视角,像素的形状经常扭曲。 然后,基元上与像素的角对应的外围区域的角将映射到纹理空间中。 映射过程再次扭曲像素的形状,这是常见的。 像素的最终颜色值是从像素映射到的区域中的纹素计算得出的。 在设置纹理筛选方法时,确定 Direct3D 用于到达像素颜色的方法。 有关详细信息,请参阅 纹理筛选(Direct3D 9)

应用程序可以直接将纹理坐标分配给顶点。 此功能可让你控制纹理的哪个部分映射到基元中。 例如,假设创建一个与下图中纹理大小完全相同的矩形基元。 在此示例中,你希望应用程序将整个纹理映射到整个墙壁上。 应用程序分配给基元顶点的纹理坐标为 (0.0,0.0)、(1.0,0.0)、(1.0,1.0)和 (0.0,1.0)。

纹理映射墙插图

如果决定将墙的高度减少一半,则可以扭曲纹理以适应较小的墙,也可以分配纹理坐标,导致 Direct3D 使用纹理下半部分。

如果你决定扭曲或缩放纹理以适应较小的墙,则使用的纹理筛选方法将影响图像的质量。 有关详细信息,请参阅 纹理筛选(Direct3D 9)

相反,如果决定为较小的墙分配纹理坐标以使 Direct3D 使用纹理的下半部分,则应用程序分配给基元的顶点的纹理坐标为(0.0,0.5)、(1.0,0.5)、(1.0,1.0)和(0.0,1.0)。 Direct3D 将纹理的下半部分应用于墙壁。

顶点的纹理坐标可能大于 1.0。 将纹理坐标分配给不在 0.0 到 1.0 范围内的顶点(含 1.0)时,还应设置纹理寻址模式。 有关详细信息,请参阅 纹理寻址模式(Direct3D 9)

纹理坐标和纹理阶段

纹理坐标通过纹理阶段与纹理相关联。 纹理使用 SetTexture(stageIndex,pTexture)分配给纹理阶段。 请参阅 IDirect3DDevice9::SetTexture

灵活顶点格式(FVF)代码最多可以定义八组纹理坐标。 纹理坐标数据由顶点数据中的用户提供。 以从零开始的索引引用数据:0 - 7。 最多有八个纹理混合阶段。 纹理与使用 SetTexture(stageIndex、pTexture)的特定阶段相关联。

完成此作后,任何阶段都可以使用任意一组纹理坐标。 每个坐标集都与使用 SetTextureStageState(stageIndex、D3DTSS_TEXCOORDINDEX、textureCoordinateIndex)的阶段相关联。 请参阅 IDirect3DDevice9::SetTextureStageState。 这样,可以设置混合阶段以使用任何纹理和任何纹理坐标。 多个阶段可以使用相同的纹理或纹理坐标。

以下主题中包含其他信息。

Direct3D 纹理