具有不同顶点输入类型的多个着色器是否可以使用相同的顶点缓冲区
can multiple shaders with different vertex input types use the same vertex buffer?
假设我有一个模型。该模型包含位置、颜色、法线和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},};
相关文章:
- 如何循环打印顶点结构
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果 BGL 中的add_vertex则检查顶点是否存在
- 是否可以在邻接列表中删除提升图中的顶点?
- 使用提升图 [BGL] 检查add_edge之前顶点是否已存在
- 如何使用广度优先搜索确定是否可以在有向图中到达顶点
- 我是否需要OpenGL中类似对象的多个顶点缓冲区
- (DirectX 11)单个顶点缓冲区是否可以一次绑定到多个 IA 输入槽
- 在OpenGL中为顶点、uvs和法线使用一个缓冲区是否比使用三个缓冲区性能更好
- 如何确定 BGL 中的 2 个顶点之间是否存在路径
- 知道我的顶点是否(以及如何)被重新排序
- 具有不同顶点输入类型的多个着色器是否可以使用相同的顶点缓冲区
- ID3D11DeviceContext::D rawIndexed 方法是否等待顶点和像素着色器操作完成
- BGL:是否可以使用C++11的范围在图的顶点上循环
- 如何找到给定图形的每对顶点之间是否有路径?
- 如何确定一个顶点是否在边界上的网格在CGAL
- 片段着色器是否处理顶点着色器中的所有像素