D3DX 中的网格支持 (Direct3D 9)
D3DX 是一个提供帮助程序服务的实用工具库。 它是 Direct3D 组件上方的一层。
网格
D3DX 实现网格构造以加载、操作和呈现 .x 文件内容。 网格基本上是定义某些几何形状的顶点的集合,以及定义面的一组索引。 网格类型有多种。
ID3DXBaseMesh 提供基础。 ID3DXMesh 继承自 ID3DXBaseMesh,并添加使用每芯片顶点缓存的网格优化。 ID3DXSkinInfo 提供蒙皮网格支持。
ID3DXBaseMesh 提供操作和查询 ID3DXMesh 网格对象的方法,网关对象继承自基础网格。 这包括邻接操作、几何缓冲区检索、锁定/解锁操作(顶点和索引)以及复制、渲染、面和顶点信息。
注意
Direct3D 9 早期版本中提供的 ID3DXPMesh 和 ID3DXSPMesh 接口(分别支持渐进式网格和简化网格)已被删除。
网格体系结构
网格包含复杂模型的数据。 它是一个抽象数据容器,包含纹理和材质等资源以及位置数据和邻接数据等属性。 有多种网格操作可以提高绘图性能和表面外观。 此外,还有许多其他网格概念会影响网格操作的功能。 了解这些网格概念,以便在应用它们时可以提高网格性能。
网格对象数据
网格包含顶点缓冲区、索引缓冲区和属性缓冲区。
- 顶点缓冲区包含顶点数据,即网格顶点。
- 索引缓冲区包含用于访问顶点缓冲区的顶点索引。 这可以通过减少重复顶点来减小顶点缓冲区大小。 只有索引网格使用索引缓冲区。 例如,如果网格由三角形列表组成,则它不使用索引缓冲区。
- 属性缓冲区包含属性数据。 属性是网格顶点的属性,无特定顺序。 D3DX 网格将每个面的属性存储在一组 DWORD 中。
属性表
属性表是属性缓冲区内容的简洁表示形式。 可通过使用 D3DXMESHOPT_ATTRSORT 调用 Optimize 方法之一、锁定属性缓冲区并用数据填充它,或调用 SetAttributeTable 来创建属性表。 当网格重新排序为组时,网格包含属性表。 假设提供了属性排序选项(D3DXMESHOPT_ATTRSORT 或更高版本),则调用 Optimize 时会发生这种情况。 D3DX 网格使用索引三角形列表,因此使用 IDirect3DDevice9::D rawIndexedPrimitive 绘制。
属性表的创建是调用 Optimize 的结果。 各个面不必相邻,因为 Optimize 会将它们重新排序为相邻。 例如,人体网格的手可以使用相同的属性。 ID 可帮助将面排序为组。 .x 文件中的网格已自动生成材质和纹理属性的特性。 确实需要调用 Optimize(ATTRSORT) 或更有效的 Optimize(VERTEXCACHE) 才能获得良好的性能。 Load 函数尝试以保存数据的确切形式呈现数据。 如果使用基于顶点缓冲区/索引缓冲区的网格,网格 API 会提供优化函数和蒙皮转换,且开销很小。
优化类型是累积的,从最差 (D3DXMESHOPT_COMPACT) 到最佳 (D3DXMESHOPT_IGNOREVERTS) 排序。 D3DXMESHOPT_STRIPREORDER 执行压缩和属性排序。 始终建议使用 D3DXMESHOPT_VERTEXCACHE,即使在没有真正顶点缓存的设备上也是如此。
应用程序数据
应用程序数据是由应用程序管理的网格数据。 网格顶点数据和这些缓冲区管理的数据之间存在紧密耦合。
材质缓冲区包含 n 种材质。 加载 .x 文件时,Load 函数会返回材质。 每个子集可以有自己的材质和纹理。 材质缓冲区是静态的。
邻接缓冲区包含有关边、面和相邻面的信息。 某些网格操作取决于了解哪些面彼此相邻。 此信息称为邻接数据,保存在邻接缓冲区中。 它不是网格的一部分,但由应用程序维护,并且必须在必要时提供给网格方法。
效果实例缓冲区包含效果实例的列表。 效果实例存储状态。 此状态信息用于初始化管道。 效果实例包含效果中的名称/值对。
高级网格主题
经过优化的网格建立在基础网格功能的基础上,并通过以下两种方法添加顶点缓存优化功能:Optimize(创建新网格)和 OptimizeInPlace(修改原始网格)。
D3DXGeneratePMesh 使用 D3DX 简化算法从输入网格生成渐进网格。 D3DXSimplifyMesh 使用相同的简化算法从输入网格生成给定细节级别的标准网格。 用户可通过每个顶点组件指定的权重和每个顶点指定的权重控制所使用的误差度量。 每个组件的权重乘以组件每个边坍缩计算的误差部分。 每个顶点的权重乘以为删除该顶点而确定的误差度量值。 例如,如果不希望删除顶点,请将该特定顶点的权重设置为较大的值。 相反,如果希望更早删除它,请将其设置为一个较小的值(小于 1)。
ID3DXSkinInfo 支持蒙皮角色。 蒙皮角色由一组网格和一组影响网格顶点的骨骼定义。 骨骼表示为转换层次结构。 对于每个网格,每个影响它的骨骼都有一个矩阵,该矩阵将网格转换为骨骼的局部坐标空间。 此矩阵是网格骨骼的骨骼空间转换。 这是在创作过程中将骨架与网格关联时定义的。
换肤
蒙皮是一种使用骨骼转换网格顶点的技术。 骨骼通常排列在分层骨架中,就像人体的骨骼一样。 然后将对象顶点与骨骼关联起来,就像将皮肤附加到骨骼上一样。 当骨骼发生变化时,皮肤也会发生变化。
蒙皮网格使用骨骼来影响许多顶点。 骨骼转换数据由用户提供,以影响如何对骨骼进行 SRT。 网格使用转换后的骨骼来影响与骨骼关联的顶点。 调色板是 SRT 转换的数组。 调色板通常作为矩阵实现,但它们可以包含 SRT 值。
渐进网格剪裁
低细节区域可能会丢失顶点,但不会改变表面的渲染外观。 当物体远离相机时尤其如此。 这称为细节级别。 用户可以使用 API 级渲染控件来设置细节级别,以最大限度地提高渲染效率。
渐进网格对象从大量面开始,并使用简化来减少面数。 独立于视图的递进网格被称为与视图无关的渐进网格 (VIPM)。
剪裁是减少面数的另一种方法。 这实际上从网格中删除顶点和面。 可以在高端(以限制最大面数)或低端(以限制最小面数)进行剪裁。剪裁可提高绘图性能,但应注意保持视觉质量。 渐进网格 SDK 示例中演示了剪裁。
对于高可见性区域,可以使用渐进细节级别 (PLOD) 提高分辨率。 这种技术可将一个面分成两个面。
面片网格
还支持两种类型的专用面片网格:矩形和三角形面片。 矩形面片网格是一种控制点以缠绕的矩形序列布局的面片网格。 矩形和三角形面片用于创建高阶曲面。 它们不像三角形网格那样常用。
相关主题