direct x 11智能地创建顶点缓冲区

direct x 11 creating vertex buffers intelligently

本文关键字:创建 顶点 缓冲区 智能 direct      更新时间:2023-10-16

我遇到了一个难题,这个难题一直困扰着我。假设我有几个着色器,它们都有不同的顶点类型,如下所示:

// 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个进行渲染,因为数据并没有正确地为所有的3个进行布局。我只看到了两种选择,这两种选择都同样痛苦。

1) 我可以在ram中有一个保存所有数据的大缓冲区,然后每次draw调用,我都会从着色器对象中获取顶点类型,并使用正确的信息创建一个新的顶点缓冲区。正如你所看到的,这将是非常缓慢的。

或者。。。

2) 当模型初始化时,我可以创建多个ID3D11Buffers,其中一个缓冲区具有位置和颜色,一个具有位置、纹理和法线,一个有位置、纹理、法线、binormal和切线,以及模型具有信息的任何其他顶点类型所需的缓冲区。相比之下,这会抹杀你的可用vram,使其成为一个nogo。

我看不出有其他办法可以做到这一点。你们其他d3d是怎么做到的?

在DX11上下文中询问这一点是件好事-ID3D11InputLayout从以前的版本中大大简化了这个概念。您可以使用CreateInputLayout创建顶点数据的多个布局(上面提供的每个结构都有一个布局),并在希望对同一顶点缓冲区进行不同解释的点使用正确布局调用IASetInputLayout。

编辑:在此处查看创建输入布局对象的示例。

希望这能有所帮助!

诀窍是将数据分离为流:p、T、A.

流p包含位置和法线。使用照明渲染顶点需要这些数据。您还可以包括二进制规范和顶点颜色数据。

流T包含纹理信息,因此可以多达8个TU通道。应注意存储此流中编码的通道数量,以确保在GPU总线上复制空通道时不会浪费内存带宽。

流A包含动画信息、骨骼重量等。

根据渲染管道的体系结构,可以有更多或更少的通道。这里的技巧是使用FVF来动态定义数据布局。这种体系结构的一个优点是优化内存带宽使用。当需要多个渲染过程,但并非每个过程都需要所有数据时,这一点尤其重要。