我有一个难题,简直把我难倒了。假设我有几个着色器,它们都有不同的顶点类型,如下所示:
// 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,其中一个缓冲区具有位置和颜色,一个缓冲区具有位置、文本坐标和法线,另一个缓冲区具有位置、纹理坐标、法线、二法线和切线,以及模型所具有的任何其他顶点类型所需的缓冲区。相比之下,这会清除可用的vram,使这也成为一种禁忌。
我看不到有任何其他方法可以做到这一点。你们d3d的其他人是怎么做到的?
发布于 2012-07-17 00:00:23
在DX11上下文中询问这个问题是一件好事-- ID3D11InputLayout从以前的版本中大大简化了这个概念。可以使用CreateInputLayout创建顶点数据的多个布局(上面提供的每个结构对应一个布局),并在希望以不同方式解释相同的顶点缓冲区的点上使用正确的布局调用IASetInputLayout。
编辑:查看here以获取创建输入布局对象的示例。
希望这能有所帮助!
发布于 2012-07-16 23:58:43
诀窍是将你的数据分成流: P,T,A。
流P包含位置和法线。此数据是使用照明渲染顶点所必需的。您还可以包括二法线和顶点颜色数据。
流T包含纹理信息,因此最多可以有8个TU通道。应注意存储在此流中编码了多少通道,以确保不会浪费内存带宽通过GPU总线复制空通道。
流A包含动画信息、骨骼权重等。
根据渲染管道的体系结构,您可以拥有更多或更少的通道。这里的诀窍是使用FVF动态定义数据布局。这种体系结构的一个优点是最佳的内存带宽使用。当需要多个渲染过程,但并非每个过程都需要所有数据时,这一点特别重要。
https://stackoverflow.com/questions/11507782
复制相似问题