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。 这样,可以将混合阶段设置为使用任何纹理和任何纹理坐标。 多个阶段可以使用相同的纹理或纹理坐标。
其他信息包含在以下主题中。
相关主题