几何图形混合 (Direct3D 9)

Direct3D 使应用程序能够通过呈现具有平滑混合关节的分段多边形对象(尤其是字符)来提高场景的真实性。 这些效果通常称为皮肤。 通过向单个顶点集应用其他世界转换矩阵以创建多个结果,然后在生成的顶点之间执行线性混合以创建一组用于渲染的几何图形,系统可实现此效果。 下图显示了香蕉的过程。

将两个对象与香蕉纹理混合的过程的插图

上图显示了如何想象几何混合过程。 在单个呈现调用中,系统会获取香蕉的顶点,转换它们两次(一次不进行修改,一次使用简单旋转)并混合结果以创建弯曲的香蕉。 启用照明时,系统会混合顶点位置以及顶点法线。 应用程序不限于两个混合路径:Direct3D 可以在多达四个世界矩阵(包括标准世界矩阵 D3DTS_WORLD)之间混合几何图形。

注意

启用照明后,顶点法线由相应的反世界视图矩阵进行转换,其权重与顶点位置计算相同。 如果D3DRS_NORMALIZENORMALS呈现状态设置为 TRUE,系统会规范化生成的法向量。

 

如果不进行几何图形混合,动态铰接模型通常以段呈现。 例如,请考虑人类手臂的 3D 模型。 在最简单的视图中,手臂有两个部分:连接到身体的上臂和连接到手的下臂。 两者在肘部连接,下臂在该点旋转。 呈现手臂的应用程序可能会保留上臂和下臂的顶点数据,每个顶点都有一个单独的世界转换矩阵。 下面的代码示例阐释了这一点。

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

为了呈现 arm,将进行两次呈现调用,如以下代码所示。

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

下图是一个香蕉,经过修改以使用此技术。

没有几何图形混合的混合香蕉的插图

混合几何图形与非双数几何图形之间的差异是显而易见的。 此示例有点极端。 在实际应用程序中,分段模型的关节设计使接缝不那么明显。 但是,接缝有时可见,这给模型设计人员带来了持续的挑战。

Direct3D 中的几何图形混合提供了经典分段建模方案的替代方法。 但是,分段对象的视觉质量的提高是呈现过程中混合计算的代价。 为了最大限度地减少这些附加操作的影响,Direct3D 几何图形管道经过优化,以尽可能少的开销混合几何图形。 智能使用 Direct3D 提供的几何图形混合服务的应用程序可以提高其字符的真实性,同时避免严重的性能后果。

混合转换和呈现状态

IDirect3DDevice9::SetTransform 方法识别D3DTS_WORLDD3DTS_WORLDn宏,这些宏对应于可由 D3DTS_WORLDMATRIX 宏定义的值。 这些宏用于标识将混合几何图形之间的矩阵。

D3DRENDERSTATETYPE 枚举类型包括用于启用和控制几何混合的D3DRS_VERTEXBLEND呈现状态。 此呈现状态的有效值由 D3DVERTEXBLENDFLAGS 枚举类型定义。 如果启用了几何混合,则顶点格式必须包含适当数量的混合权重。

混合权重

混合权重(有时称为 beta 权重)控制给定世界矩阵对顶点的影响程度。 混合权重是范围从 0.0 到 1.0 的浮点值,采用顶点格式编码,其中值 0.0 表示顶点未与该矩阵混合,1.0 表示顶点完全受矩阵影响。

几何混合权重以顶点格式编码,紧跟在每个顶点的位置之后,如 固定函数 FVF 代码 (Direct3D 9) 中所述。 通过在提供给呈现方法的顶点说明中包含 一个 FVF 常量 ,可以传达顶点格式的混合权重数。

系统在混合矩阵的加权结果之间执行线性混合。 以下公式是完整的混合公式。

使用世界转换矩阵的线性混合公式

在前面的公式中,vBlend 是输出顶点,v 元素是应用的世界矩阵 (D3DTS_WORLDn) 生成的顶点。 W 元素是顶点格式中的相应权重值。 在 n 个矩阵之间混合的顶点可以有 - 1 个混合权重值,每个混合矩阵各有一个,最后一个值除外。 系统自动生成最后一个世界矩阵的权重,使所有权重的总和为 1.0,以此处的西格玛表示法表示。 对于 Direct3D 支持的每个情况,可以简化此公式,如以下公式所示。

三种混合情况的线性混合公式

这些是两种、三种和四种混合矩阵情况的完整混合公式的简化形式。

注意

尽管 Direct3D 包含 FVF 描述符来定义最多包含五个混合权重的顶点,但在此版本的 DirectX 中只能使用三个。

 

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

顶点管道