在DirectX 11演示应用程序中,我使用CDXUTSDKMesh
作为静态几何体。它已加载并已显示。
我在此应用程序中进行了与预计算辐射传输相关的一些实验。 ID3DXPRTEngine
对于这项工作来说将是一个非常方便的工具。不幸的是,D3DX和DXUT在那里看起来并不相容。
ID3DXPRTEngine
需要一个ID3DXMesh
(多个网格可以与D3DXConcatenateMeshes
连接没问题)。是否有一种简单的方法来转换' CDXUTSDKMesh
到一个或多个ID3DXMesh
个实例?
答案 0 :(得分:1)
简答:不。
答案很长:可以这样做,但它要求您能够读取原始顶点数据,将其转换为Direct3D 9 FVF系统(旧的固定着色器管道),然后重新写入新数据。
基本上你要做的是互操作两个不同版本的Direct3D API:版本9.0和版本11.0。为此,您需要执行以下操作:
确认您的verticies不包含自定义语义(即D3D11允许像RANDOM_EYE_VEC
这样的语义,而D3D9则不包含。{
确认您能够将顶点和面部信息读入字节缓冲区(即字符指针)。
创建Direct3D 9设备和Direct3D 11设备。
打开网格,将数据拉入字节缓冲区,然后根据该数据创建ID3DXMesh
对象。如果您有超过2 ^ 16个面,则需要将网格划分为两个或更多网格。
从网格物体创建PRT引擎,然后运行PRT计算。
使用ID3DXBaseMesh::GetVertexBuffer()
从网格中读取新信息(不确定此步骤是否完全正确,因为我从未实际使用过PRT引擎)。
将新数据写回CDXUTSDKMesh
。
正如您可能知道的那样,此过程很长,容易出错,而且非常慢。如果您正在为离线工具执行此操作,则可能没问题,但如果要实时使用,您可能最好编写自己的PRT引擎。
此外,如果您的网格物体具有任何自定义语义(即您使用的着色器需要一些不属于D3D9世界的数据),则此算法将失败。 PRT引擎使用固定功能管道,因此任何利用当时不存在的D3D11功能的新网格都无法在这里工作。