gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:15 25 4
gpt4 key购买 nike

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

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

尽管该模型中包含用于获取位置和颜色的着色器的信息,但我无法使用它,因为存在多余的数据。我能想到的唯一其他解决方案是让多个顶点缓冲区具有相同的信息减去几个字段,但这只是多余的。真的必须有更好的方法。有什么帮助吗?

编辑:我想我会在工作前花一些时间详细说明我的问题。在谈论顶点缓冲区时,我指的是您使用 ID3D11Device::CreateBuffer 创建的 ID3D11Buffer *。在手之前,我在那里填充了一个类型为 Vertex_PCNT2 的顶点数组。据我目前所知,该缓冲区现在永久采用这种格式,因此所有着色器都必须使用这种格式。当数据已经存在时,设置其他缓冲区只会对 ram 造成压力。

最佳答案

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

InputLayout 正是为这种场景而做的。它基本上是将原始数据的布局与绑定(bind)到顶点着色器输入的布局解耦。

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

在只选择“POSITION”(偏移量0)和“COLOR”(字节偏移量:12)的情况下:

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 },}; 

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

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 },}; 

关于c++ - 具有不同顶点输入类型的多个着色器可以使用相同的顶点缓冲区吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11436146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com