从CDXUTSDKMesh获取ID3DXMesh

时间:2014-10-10 14:24:14

标签: directx-11 d3dx id3dxmesh dxut

在DirectX 11演示应用程序中,我使用CDXUTSDKMesh作为静态几何体。它已加载并已显示。

我在此应用程序中进行了与预计算辐射传输相关的一些实验。 ID3DXPRTEngine对于这项工作来说将是一个非常方便的工具。不幸的是,D3DX和DXUT在那里看起来并不相容。

ID3DXPRTEngine需要一个ID3DXMesh(多个网格可以与D3DXConcatenateMeshes连接没问题)。是否有一种简单的方法来转换' CDXUTSDKMesh到一个或多个ID3DXMesh个实例?

1 个答案:

答案 0 :(得分:1)

简答:不。

答案很长:可以这样做,但它要求您能够读取原始顶点数据,将其转换为Direct3D 9 FVF系统(旧的固定着色器管道),然后重新写入新数据。

基本上你要做的是互操作两个不同版本的Direct3D API:版本9.0和版本11.0。为此,您需要执行以下操作:

  1. 确认您的verticies不包含自定义语义(即D3D11允许像RANDOM_EYE_VEC这样的语义,而D3D9则不包含。{

  2. 确认您能够将顶点和面部信息读入字节缓冲区(即字符指针)。

  3. 创建Direct3D 9设备和Direct3D 11设备。

  4. 打开网格,将数据拉入字节缓冲区,然后根据该数据创建ID3DXMesh对象。如果您有超过2 ^ 16个面,则需要将网格划分为两个或更多网格。

  5. 从网格物体创建PRT引擎,然后运行PRT计算。

  6. 使用ID3DXBaseMesh::GetVertexBuffer()从网格中读取新信息(不确定此步骤是否完全正确,因为我从未实际使用过PRT引擎)。

  7. 将新数据写回CDXUTSDKMesh

  8. 正如您可能知道的那样,此过程很长,容易出错,而且非常慢。如果您正在为离线工具执行此操作,则可能没问题,但如果要实时使用,您可能最好编写自己的PRT引擎。

    此外,如果您的网格物体具有任何自定义语义(即您使用的着色器需要一些不属于D3D9世界的数据),则此算法将失败。 PRT引擎使用固定功能管道,因此任何利用当时不存在的D3D11功能的新网格都无法在这里工作。