纹理混合 (Direct3D 9)

Direct3D 可以在单程内最多将八个纹理融合到基元。 使用多个纹理混合可以显著增加 Direct3D 应用程序的帧速率。 应用程序可通过多个纹理混合,在单程内应用纹理、阴影、镜面光、漫射照明以及其他的特殊效果。

若要使用纹理混合,应用程序首先应检查用户的硬件是否支持纹理混合。 此信息位于 D3DCAPS9 结构的 TextureCaps 成员中。 有关如何查询用户硬件的纹理混合功能的详细信息,请参阅 IDirect3DDevice9::GetDeviceCaps

纹理阶段和纹理混合级联

Direct3D 支持通过使用纹理层实现单程内的多个纹理混合。 纹理层取两个参数并对其执行混合操作,然后传递结果以进行进一步处理或光栅化。 你可以查看下图所示的纹理层。

纹理层图示

如上图所示,纹理层使用指定的运算符将两个参数混合。 常见操作包括简单的调制,或者添加参数的颜色或 α 值,但此外还有二十多个操作也受支持。 纹理层参数可以是一个相关的纹理、重复的颜色或 α 值(在高洛德着色过程中重复)、任意的颜色或 α 值,也可以是从之前纹理层获得的结果。 有关详细信息,请参阅 纹理混合操作和参数 (Direct3D 9)

注意

Direct3D 将颜色混合与 alpha 混合区分开来。 应用程序针对颜色和 α 单独设置混合操作以及相关参数,所以这些设置的结果是相互独立的。

 

将多个混合层所用的参数以及操作相结合,可以定义一种基于流的简单混合语言。 从某个纹理层得出的结果流到另一层,再从这一层流到下一层,依此类推。 结果在各纹理层之间流动并最终在多边形上光栅化的概念通常被称作纹理混合层叠。 下图显示了单个纹理层如何形成纹理混合层叠。

纹理混合层叠的纹理层图示

设备中的各层都采用以零为基准的索引。 Direct3D 最多支持八个混合层,不过你始终应该检查设备功能,以确定当前硬件支持多少层。 第一个混合层使用索引 0,第二个混合层使用索引 1,依此类推,第八个混合层使用索引 7。 系统以索引升序的形式混合各层。

只使用所需数量的层;不用的混合层默认处于禁用状态。 因此,如果应用程序只使用前两层,则只需要设置纹理层 0 和 1 的相关操作及参数。 系统将混合这两层并忽略禁用的层。

注意

如果应用程序在不同情况下使用不同数量的层(比如针对某些对象使用四层,针对其他对象只使用两层),则你无需明确禁用所有之前使用的层。 一种方法是禁用第一个不使用层的颜色操作,这样颜色操作就不会应用到具有更高索引的所有层。 另一个选项是通过将第一个纹理阶段 (阶段 0) 的颜色操作设置为D3DTOP_DISABLE来完全禁用纹理映射。 第三个选项是,当纹理阶段D3DTSS_COLORARG1等于D3DTA_TEXTURE并且阶段的纹理指针为 NULL 时,不处理此阶段和之后的所有阶段。

 

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

Direct3D 纹理