Direct3D 9) (纹理坐标

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

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

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

将纹素映射到屏幕空间

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

纹理中的每个纹素都可以由其纹素坐标指定。 但是,为了将纹素映射到基元上,Direct3D 需要所有纹理中所有纹素的统一地址范围。 因此,它使用通用寻址方案,其中所有纹素地址都在 0.0 到 1.0(含)的范围内。 Direct3D 应用程序以你、v 值指定纹理坐标,这与以 x,y 坐标指定的 2D 笛卡尔坐标非常类似。 从技术上讲,系统实际上可以处理 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) 。

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

下图显示了纹素映射过程的简化版本。 无可否认,此示例非常简单。 有关详细信息,请参阅 direct Mapping Texels to Pixels (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(含 0.0 到 1.0)范围内的顶点时,还应设置纹理寻址模式。 有关详细信息,请参阅 纹理寻址模式 (Direct3D 9)

纹理坐标和纹理阶段

纹理坐标通过纹理阶段与纹理相关联。 纹理分配到具有 SetTexture (stageIndex、pTexture) 的纹理阶段。 请参阅 IDirect3DDevice9::SetTexture

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

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

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

Direct3D 纹理