C++ 单个缓冲区中的不同顶点/索引格式

C++ 单个缓冲区中的不同顶点/索引格式,c++,windows,direct3d,direct3d11,C++,Windows,Direct3d,Direct3d11,在我的场景中,我有几个永远不变的静态模型。有些模型只有浮动3个顶点和16位索引,有些模型更复杂,顶点有颜色和法线,还有32位索引 问题1。我可以将它们组合在一个顶点和索引缓冲区中,并像这样绘制: // Model #1 has only position and 16 bit indices const int model1verts = 20, model1indices = 100; UINT stride1 = sizeof( Vector3 ), offset1 = 0; context

在我的场景中,我有几个永远不变的静态模型。有些模型只有浮动3个顶点和16位索引,有些模型更复杂,顶点有颜色和法线,还有32位索引

问题1。我可以将它们组合在一个顶点和索引缓冲区中,并像这样绘制:

// Model #1 has only position and 16 bit indices
const int model1verts = 20, model1indices = 100;
UINT stride1 = sizeof( Vector3 ), offset1 = 0;
context->IASetVertexBuffers( 0, 1, &vb, &stride1, &offset1 );
context->IASetIndexBuffer( ib, DXGI_FORMAT_R16_UINT, 0 );
context->DrawIndexed( model1indices, 0, 0 );
// Set another shader + input layout here

// Model #2 has positions + normals, and 32 bit indices
const int model2verts = 200, model2indices = 500;
UINT stride2 = sizeof( Vector3 ) * 2, offset2 = stride1 * model1verts;
context->IASetVertexBuffers( 0, 1, &vb, &stride2, &offset2 );
context->IASetIndexBuffer( ib, DXGI_FORMAT_R32_UINT, model1indices * sizeof( uint16_t ) );
context->DrawIndexed( model2indices, 0, 0 );
// 20 more models to follow, all from the same buffers
问题2。另外,GPU喜欢对齐的数据。调用IASetVertexBuffers/IASetIndexBuffer时,这些偏移量是4字节还是16字节的倍数?文档并没有这样说


第三季度。我应该这么做吗?与20-100个较小的缓冲区(每个缓冲区都有自己的格式)相比,这会节省资源吗?

关于您的问题1:从技术上讲,我认为它应该可以工作。然而,我想这并没有什么真正的好处,使用异构缓冲区可能会使事情变得更加复杂。我建议将具有类似布局的模型放在一个缓冲区中。此外,您可以尝试转换它们(即对所有索引缓冲区使用R32)。如果它们只是小模型,开销可能并不重要。@JackWhite好的,谢谢你的输入,现在我决定只合并相同的顶点格式。