简短的回答:没有。
长答案:可以做到,但它要求您能够读取原始顶点数据,将其转换为 Direct3D 9 FVF 系统(旧的固定着色器管道),然后将新数据写回。
基本上,您要做的是互操作 Direct3D API 的两个不同版本:9.0 版和 11.0 版。为此,您需要执行以下操作:
确认您的顶点不包含自定义语义(即 D3D11 允许类似 的语义RANDOM_EYE_VEC
,而 D3D9 不允许)。
确认您有能力将您的顶点和面信息读入字节缓冲区(即字符指针)。
创建 Direct3D 9 设备和 Direct3D 11 设备。
打开您的网格,将数据拉入字节缓冲区,然后ID3DXMesh
从该数据创建一个对象。如果您有超过 2^16 个面,则需要将网格拆分为两个或多个网格。
从网格创建 PRT 引擎,并运行您的 PRT 计算。
ID3DXBaseMesh::GetVertexBuffer()
使用(不确定此步骤是否完全正确,因为我从未实际使用过 PRT 引擎)从网格中读取新信息。
将新数据写回CDXUTSDKMesh
.
正如您可能知道的那样,这个过程很长,容易出错,而且非常慢。如果您是为离线工具执行此操作,可能没问题,但如果要实时使用,您最好编写自己的 PRT 引擎。
此外,如果您的网格具有任何自定义语义(即,您使用的着色器需要一些不属于 D3D9 世界的数据),那么该算法将失败。PRT 引擎使用固定功能管道,因此任何利用当时不存在的 D3D11 功能的新网格都不会在这里工作。