0

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

我正在这个应用程序中做一些与预计算辐射转移相关的实验。这ID3DXPRTEngine将是一个非常方便的工具。不幸的是,D3DX 和 DXUT 在那里似乎不太兼容。

ID3DXPRTEngine需要一个(可以毫无问题ID3DXMesh地连接多个网格)。D3DXConcatenateMeshes有没有一种简单的方法可以“转换”CDXUTSDKMesh为一个或多个ID3DXMesh实例?

4

1 回答 1

1

简短的回答:没有。

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

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

  1. 确认您的顶点不包含自定义语义(即 D3D11 允许类似 的语义RANDOM_EYE_VEC,而 D3D9 不允许)。

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

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

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

  5. 从网格创建 PRT 引擎,并运行您的 PRT 计算。

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

  7. 将新数据写回CDXUTSDKMesh.

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

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

于 2014-10-10T15:05:56.670 回答