我有一个难题,简直把我难住了。假设我有几个着色器,它们都具有不同的顶点类型,如下所示:
// light shader
struct vertexInputType
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 normal : NORMAL;
};
// color shader
struct vertexInputType
{
float4 position : POSITION;
float4 color : COLOR;
};
// bump mapping shader
struct vertexInputType
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 normal : NORMAL;
float3 binormal : BINORMAL;
float3 tangent : TANGENT;
};
现在假设我有一个包含所有这些数据的模型。我不能完全将它们全部放在同一个缓冲区中并按照我选择的所有 3 个进行渲染,因为数据没有为所有这些缓冲区正确布局。我只看到两个选项可以使这成为可能,它们都一样痛苦。
1)我可以在 ram 中有一个大缓冲区来保存所有数据,然后每次绘制调用,我从着色器对象中获取顶点类型并创建一个具有正确信息的新顶点缓冲区。如您所见,这将非常缓慢。
或者...
2) 我可以在模型初始化时创建多个 ID3D11Buffers,其中一个缓冲区具有位置和颜色,一个具有位置、texcoord 和法线,一个具有位置、texcoord、法线、副法线和切线,以及所需的尽可能多的缓冲区对于模型具有信息的任何其他顶点类型。相比之下,这会抹杀您可用的 vram,也使其成为 nogo。
我看不出有任何其他方法可以做到这一点。你们其他 d3d 人是如何做到这一点的?