Sign in to follow this  

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

This topic is 1814 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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);

Edited by e.s.

Share this post


Link to post
Share on other sites
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. Edited by eppo

Share this post


Link to post
Share on other sites

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!

Edited by e.s.

Share this post


Link to post
Share on other sites
Sign in to follow this