具有不同顶点输入类型的多个着色器是否可以使用相同的顶点缓冲区

can multiple shaders with different vertex input types use the same vertex buffer?

本文关键字:顶点 是否 缓冲区 可以使 输入 类型      更新时间:2023-10-16

假设我有一个模型。该模型包含位置、颜色、法线和2个纹理坐标的数据。现在假设我有一个着色器,它的输入类型仅为位置和颜色。然而,该模型的顶点缓冲区的格式为:

struct Vertex_PCNT2
{
    D3DXVECTOR3 position;
    D3DXVECTOR4 color;
    D3DXVECTOR3 normal;
    D3DXVECTOR2 tex1;
    D3DXVECTOR2 tex2;
};

尽管这个模型中有获取位置和颜色的着色器的信息,但我不能使用它,因为有多余的数据。我能想到的唯一其他解决方案是使用多个具有相同信息的顶点缓冲区减去几个字段,但这完全是多余的。必须有更好的方法。这里有人帮忙吗?

编辑:我想我会在上班前花点时间详细阐述一下我的问题。当谈到顶点缓冲区时,我指的是使用ID3D11Device::CreateBuffer创建的ID3D11Buffer*。在手动之前,我在上面填充一个顶点数组,类型为Vertex_PNCT2。根据我目前所知,缓冲区现在永久采用这种格式,因此所有着色器都必须使用这种格式。当数据已经存在时,设置其他缓冲区只会给ram带来压力。

通常,这是通过为同一顶点缓冲区创建不同的InputLayout来完成的。请记住,InputLayout可以充当顶点输入数据和顶点着色器的预期输入之间的过滤视图。

InputLayout正是针对这种场景完成的。它基本上是将原始数据的布局和绑定到顶点着色器输入的布局解耦。

例如,如果只需要映射位置和颜色,则只需使用两个D3D11_input_ELEMENT_DESC元素的数组实例化输入布局,并设置正确的AlignedByteOffset。

在只选择"POSITION"(偏移量0)和"COLOR"(偏移值以字节为单位:12)的情况下:

D3D11_INPUT_ELEMENT_DESC布局[]={{"位置",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},{"颜色",0,DXGI_FORMAT_R32G32B32A32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0},};

但您也可以只选择"POSITION"(偏移0)和"NORMAL"(偏移28):

D3D11_INPUT_ELEMENT_DESC布局[]={{"位置",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},{"正常",0,DXGI_FORMAT_R32G32B32A32_FLOAT,0,28,D3D11_INPUT_PER_VERTEX_DATA,0},};