【发布时间】:2012-07-17 00:57:29
【问题描述】:
我遇到了一个让我很头疼的难题。假设我有几个着色器,它们都具有不同的顶点类型,如下所示:
// 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 人是怎么做到的?
【问题讨论】:
标签: c++ directx-11