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

C++ 具有不同顶点输入类型的多个着色器是否可以使用相同的顶点缓冲区?,c++,direct3d11,C++,Direct3d11,假设我有一个模型。此模型具有位置、颜色、法线和2个纹理坐标的数据。现在假设我有一个着色器,其输入类型仅为位置和颜色。但是,此模型的顶点缓冲区的格式为: struct Vertex_PCNT2 { D3DXVECTOR3 position; D3DXVECTOR4 color; D3DXVECTOR3 normal; D3DXVECTOR2 tex1; D3DXVECTOR2 tex2; }; 尽管这个模型中包含了着色器的位置和颜色信息,但我不能使用它,因

假设我有一个模型。此模型具有位置、颜色、法线和2个纹理坐标的数据。现在假设我有一个着色器,其输入类型仅为位置和颜色。但是,此模型的顶点缓冲区的格式为:

struct Vertex_PCNT2
{
    D3DXVECTOR3 position;
    D3DXVECTOR4 color;
    D3DXVECTOR3 normal;
    D3DXVECTOR2 tex1;
    D3DXVECTOR2 tex2;
};
尽管这个模型中包含了着色器的位置和颜色信息,但我不能使用它,因为有多余的数据。我唯一能想到的另一个解决方案是让多个顶点缓冲区具有相同的信息,减去几个字段,但这完全是多余的。必须有更好的办法。有人帮忙吗


编辑:我想我应该在工作前花点时间详细阐述一下我的问题。当谈到顶点缓冲区时,我指的是使用ID3D11Device::CreateBuffer创建的ID3D11Buffer*。在此之前,我填充了一个顶点数组,上面有类型为Vertex_PCNT2的顶点。从这里我可以看出,缓冲区现在永久使用这种格式,所以所有着色器都必须使用这种格式。当数据已经存在时,设置其他缓冲区只会对ram造成压力。

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

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

例如,如果只需要映射位置和颜色,则只需使用两个元素的数组实例化一个输入布局,该数组具有正确的AlignedByteOffset集

如果仅选择“位置”(偏移量0)和“颜色”(偏移量以字节为单位:12):

D3D11输入元素描述布局[]= { {“位置”,0,DXGI_格式_R32G32B32_浮点,0,0,D3D11_输入_逐顶点_数据,0}, {“COLOR”,0,DXGI_格式_R32G32B32A32_浮点,0,12,D3D11_输入_逐顶点_数据,0}, }; 但您也可以只选择“位置”(偏移0)和“正常”(偏移28):

D3D11输入元素描述布局[]= { {“位置”,0,DXGI_格式_R32G32B32_浮点,0,0,D3D11_输入_逐顶点_数据,0}, {“正常”,0,DXGI_格式_R32G32B32A32_浮点,0,28,D3D11_输入_逐顶点_数据,0}, };
您是否尝试过不在顶点着色器中声明或使用其他属性?你不必仅仅因为数据在那里就使用它。它会不会减慢着色器进入比需要的更大顶点的速度?我知道它不会用这些额外的数据做任何事情,但是我能不能不需要在整个顶点中传递,从而节省一些字节或速度呢?不!您得到的所有性能影响首先来自顶点缓冲区中的数据。如果不使用数据,着色器将不会加载和传递数据。顶点声明告诉图形卡顶点在内存中的布局。它不是一个命令,上面写着“使用所有这些数据”。把它想象成一个结构数组。你不会发明一个新的类型并将你的数组转换成它,仅仅因为你要将它传递给一个函数,而不是使用结构的每一个成员。顶点缓冲区总是在VRAM中。VRAM的存在是因为来回传输大量数据的速度很慢。因此,如果您已经在VRAM中保存了一次数据,那么再次引用它不会影响性能或内存。 D3D11_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR" , 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; D3D11_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "NORMAL" , 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 }, };