我有一个难以理解的难题。假设我有几个着色器都有不同的顶点类型,如下所示:
// 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和normal,一个具有position,texcoord,normal,binormal和tangent,还有as模型具有信息的任何其他顶点类型所需的许多缓冲区。相比之下,这会消除你可用的vram,使其成为nogo。
我看不到任何其他方式这样做。你是如何做其他d3d人的呢?
答案 0 :(得分:2)
你在DX11环境中询问这个问题是件好事 - ID3D11InputLayout从以前的版本中简化了这个概念。您可以使用CreateInputLayout创建顶点数据的多个布局(上面提供的每个结构一个),并在您想要的位置使用正确的布局调用IASetInputLayout顶点缓冲区的解释方式不同。
编辑:查看here以获取创建Input-Layout对象的示例。
希望这有帮助!
答案 1 :(得分:1)
技巧是将数据分成流:P,T,A。
流P包含位置和法线。需要此数据才能使用光照渲染顶点。您还可以包含副法线和顶点颜色数据。
Stream T包含纹理信息,因此最多可以有8个TU通道。应注意存储在此流中编码的通道数,以确保不会浪费内存带宽来复制GPU总线上的空通道。
流A包含动画信息,骨骼权重等
根据渲染管道的体系结构,您可以拥有更多或更少的通道。这里的技巧是使用FVF动态定义您的数据布局。该架构的一个优点是最佳的内存带宽使用率。当需要多个渲染过程时,这尤其相关,但并非每次传递都需要所有数据。