How to Bind Multiple Shapes/Models to One Vertex Buffer?

Started by
1 comment, last by e.s. 11 years, 2 months ago

If I have two Vertex Arrays, one for Square, and one for Triangle; what is the best way to bind them to the VertexBuffer?

  1. Is this possible with objects that have different numbers of Vertices?
  2. Is this possible with objects that have different buffer element descriptions, (one with float4 position data, and another with float3 and texcoords, etc).

I have about 100 static model templates that I would like to bind to the vertex buffer, and a few thousand instances associated with those models in an instance buffer.

I can DrawInstanced/Indexed and point to the appropriate pointer in the vertex buffer for reading, (I think), so I am just trying to figure out the best way to get the vertices into the vertex buffer in the first place.

Thanks!

Currently, I am binding one Shape, (a triangle), to the subresource like this:

ModelRenderer::StaticBufferDescription.ByteWidth = bufferSize;
ModelRenderer::StaticBufferDescription.BindFlags = D3D11_BIND_VERTEX_BUFFER;


ModelRenderer::StaticSubResourceData.SysMemPitch = 0;
ModelRenderer::StaticSubResourceData.SysMemSlicePitch = 0;
ModelRenderer::StaticSubResourceData.pSysMem = model->GetVertices();

DeviceManager::Device->CreateBuffer(
& ModelRenderer::StaticBufferDescription,
& ModelRenderer::StaticSubResourceData,
& ModelRenderer::StaticBuffer);

Advertisement
1. Yes. You can combine multiple meshes into a single vertex buffer. Use the BaseVertexLocation argument to Draw...() to offset into the buffer.
2. Yes. As long as all vertex-elements have the same byte size (the pStrides argument you pass to IASetVertexBuffers()).

(float3)POSITION + (float2)UV1 + (float2)UV2 = (3 * 4 bytes) + (2 * 4 bytes) + (2 * 4 bytes)
(float3)POSITION + (float4)TANGENT = (3 * 4 bytes) + (4 * 4 bytes)

If vertices in two combined streams have a different size, it's possible to pad the first stream so the second's stride lines up with its first vertex correctly.

You bind an input layout to describe the data layout (the 'type') of a vertex.

Thanks!

What is the best way of appending to:

ModelRenderer::StaticSubResourceData.pSysMem = model->GetVertices(); ?

Is it better to make a single array of ALL vertices and make this assignment? Or better to use streams?

Knowing that a VertexBuffer can only be associated with 1 stride size is very helpful.

Thanks again!

This topic is closed to new replies.

Advertisement