Font and 2D Rectangle Vertex Buffer Combination?

Started by
1 comment, last by BearInATie 10 years, 9 months ago

Hey Everyone! (Long time lurker, first time posting :D )

So I've been programming in C++ for awhile, and recently decided to dive deeper into graphics, beginning with DirectX 11. I've gotten pretty far, and have written some shaders and the like. (Nothing too fancy, but something I can be proud of for the moment)

However, I've run into a snag, I'm trying to render a grid of 2D rectangles with text on top. Both work, independently, but when combining I'm a little stuck.

I've narrowed it down to the actual setting of the buffers; the grid has-a text object, and the text is rendered after the grid square is drawn. Draw the grid square first and its fine, draw it with the text and its 1/10th the size (like so: http://imgur.com/G1NyGf6)

I'm fairly certain this is because of the grid's buffer data being overwritten by the text data. So my questions are (after the long-winded wind up):

1- Am I right in assuming the grid's buffer data is being overwritten with the text's? (the deviceContext used in both code snippets refers to the SAME deviceContext object)

2- Is there some elegant way to combine these different buffers? (see the code below)

Thanks!

The text code bit:


bool Text::RenderSentence(ID3D11DeviceContext* deviceContext, int sentenceIndex, D3DXMATRIX worldMatrix, 
      D3DXMATRIX orthoMatrix){
unsigned int stride, offset;
D3DXVECTOR4 pixelColor;
bool result;


stride = sizeof(VertexType); 
offset = 0;


deviceContext->IASetVertexBuffers(0, 1, &m_sentences[sentenceIndex]->vertexBuffer, &stride, &offset);


deviceContext->IASetIndexBuffer(m_sentences[sentenceIndex]->indexBuffer, DXGI_FORMAT_R32_UINT, 0);


deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);


pixelColor = D3DXVECTOR4(m_sentences[sentenceIndex]->red, m_sentences[sentenceIndex]->green, m_sentences[sentenceIndex]->blue, 1.0f);


result = m_FontShader->Render(deviceContext, m_sentences[sentenceIndex]->indexCount, worldMatrix, m_baseViewMatrix, orthoMatrix, m_Font->GetTexture(), 
     pixelColor);
if(!result){
return false;
}


return true;
}

And the Grid Square:


void GridSquare::RenderBuffers(ID3D11DeviceContext* deviceContext){
unsigned int stride = sizeof(VertexType);
unsigned int offset = 0;


//set vertex buffer to active in IA for rendering
deviceContext->IASetVertexBuffers(0, 1, &m_vertexBuffer, &stride, &offset);


//set index buffer to active in IA for rendering
deviceContext->IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R32_UINT, 0);


//set primitive to be used
deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}

Advertisement

It sounds like your are forgetting to set your world matrix properly in between draw calls for your grid and your text. If you don't update the constant buffers on the cpu or the gpu with VSSetConstantBuffers then they will remain the way they were set for the previous draw call.

That' didn't seem to be it :( I have a separate Font and Texture classes that are called, each updates calls VSSetConstantBuffers and then draws :(

This topic is closed to new replies.

Advertisement