Mapping a Vertex Buffer in DirectX11
Posted
by
judeclarke
on Game Development
See other posts from Game Development
or by judeclarke
Published on 2011-08-06T17:23:00Z
Indexed on
2012/06/23
21:26 UTC
Read the original article
Hit count: 1012
I have a VertexBuffer that I am remapping on a per frame base for a bunch of quads that are constantly updated, sharing the same material\index buffer but have different width/heights. However, currently right now there is a really bad flicker on this geometry.
Although it is flickering, the flicker looks correct. I know it is the vertex buffer mapping because if I recreate the entire VB then it will render fine. However, as an optimization I figured I would just remap it. Does anyone know what the problem is?
The length (width, size) of the vertex buffer is always the same.
One might think it is double buffering, however, it would not be double buffering because it only happens when I map/unmap the buffer, so that leads me to believe that I am setting some parameters wrong on the creation or mapping.
I am using DirectX11, my initialization and remap code are:
Initialization code
D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DYNAMIC;
bd.ByteWidth = vertCount * vertexTypeWidth;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
//bd.CPUAccessFlags = 0;
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory( &InitData, sizeof(InitData) );
InitData.pSysMem = vertices;
mVertexType = vertexType;
HRESULT hResult = device->CreateBuffer( &bd, &InitData, &m_pVertexBuffer );
// This will be S_OK
if(hResult != S_OK)
return false;
Remap code
D3D11_MAPPED_SUBRESOURCE resource;
HRESULT hResult = deviceContext->Map(m_pVertexBuffer, 0,
D3D11_MAP_WRITE_DISCARD, 0, &resource);
// This will be S_OK
if(hResult != S_OK)
return false;
resource.pData = vertices;
deviceContext->Unmap(m_pVertexBuffer, 0);
© Game Development or respective owner