По какой-то причине, за пределами моего понимания, моя 3D-сцена исчезает, когда я звоню
this->sp->Begin(D3DX10_SPRITE_SORT_TEXTURE);
Где this-> sp это LPD3DX10SPRITE.
отрендерить мою 2D сцену. Моя 3D-сцена также исчезает, когда я звоню
RECT rc = {5, 5, 0, 0};
this->TR.Font->DrawText(
NULL,
SS.str().c_str(),
-1,
&rc,
DT_NOCLIP,
D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f));
Где это-> TR.Font это ID3DX10Font.
Должен ли я использовать ID3D10RenderTargetView для каждой сцены, а затем объединить в конце моей функции рисования?
Если это поможет, вот функция Draw ().
void Draw()
{
this->GDM.Clear(Color(100, 149, 237));
this->GDM.Device->RSSetState(this->GDM.RasterizerState);
this->GDM.Device->OMSetBlendState(this->GDM.BlendState, 0, 0xffffffff);
this->GDM.EnableZBuffer(true);
static float r;
D3DXMATRIX w;
D3DXMatrixIdentity(&w);
//D3DXMatrixRotationY(&w, r);
r += 0.01f * (3.14f / 180.0f);// * (float)Time->Scalar;this->effect.WorldMatrix->SetMatrix(w);
this->effect.ViewMatrix->SetMatrix(viewMatrix);
this->effect.ProjectionMatrix->SetMatrix(projectionMatrix);
Vertex_PosCol * v = NULL;
this->VertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**) &v);
v[0] = Vertex_PosCol(D3DXVECTOR3(-1,-1,0), D3DXVECTOR4(1,0,0,1));
v[1] = Vertex_PosCol(D3DXVECTOR3(0,1,0), D3DXVECTOR4(0,1,0,1));
v[2] = Vertex_PosCol(D3DXVECTOR3(1,-1,0), D3DXVECTOR4(0,0,1,1));
this->VertexBuffer->Unmap();
this->GDM.Device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
//this->GDM.Device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP);
D3D10_TECHNIQUE_DESC techDesc;
this->effect.Technique->GetDesc( &techDesc );
for (int p = 0; p < techDesc.Passes; p++)
{
this->effect.Technique->GetPassByIndex( p )->Apply( 0 );
this->GDM.Device->Draw(3, 0);
}
this->GDM.EnableZBuffer(false);
this->sBatch->Begin();
if (loaded)
{
this->sBatch->Draw(
s1,
this->Input->Mouse.Position.x,
this->Input->Mouse.Position.y,
200,
200,
45.0f * (3.14f / 180.0f));
this->sBatch->Draw(s2, x, y, 200, 200);
}
this->sBatch->End();
SS << "Graphics Test And Development" << "\n";
SS << "FPS: " << this->Time->FPS << "\n";
SS << "X: " << x << "\n";
SS << "Y: " << y << "\n";
RECT rc = {5, 5, 0, 0};
this->TR.RenderText(this->SS.str().c_str(), 5, 5, &Color(0.0f, 1.0f, 0.0f, 1.0f));
this->SS.str("");
}
Как уже упоминалось в комментариях выше, установка D3DX10_SPRITE_SAVE_STATE решила проблему, связанную с рендерингом 2D с 3D. Однако это не помешало DrawText удалить 3D-сцену. Несколько лет назад у меня это работало, поэтому я потратил час, пытаясь найти свой старый код. К сожалению, я не мог, но мне удалось отследить учебник, которому я следовал в то время.
Вот решение:
Вместо того, чтобы создавать и отбрасывать вершины, каждый кадр таким, каким я был:
this->VertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**) &v);
v[0] = Vertex_PosCol(D3DXVECTOR3(-1,-1,0), D3DXVECTOR4(1,0,0,1));
v[1] = Vertex_PosCol(D3DXVECTOR3(0,1,0), D3DXVECTOR4(0,1,0,1));
v[2] = Vertex_PosCol(D3DXVECTOR3(1,-1,0), D3DXVECTOR4(0,0,1,1));
this->VertexBuffer->Unmap();
Я создал буфер вершин и индексов в функции Load ():
UINT VerticeCount = 3;
ULONG IndexCount = 3;
Vertex_PosCol * vertices = NULL;
vertices = new Vertex_PosCol[VerticeCount];
vertices[0].Position = D3DXVECTOR3(-1.0f, -1.0f, 0.0f); // Bottom left.
vertices[0].Color = D3DXVECTOR4(1.0f, 0.0f, 0.0f, 1.0f);
vertices[1].Position = D3DXVECTOR3(0.0f, 1.0f, 0.0f); // Top middle.
vertices[1].Color = D3DXVECTOR4(0.0f, 1.0f, 0.0f, 1.0f);
vertices[2].Position = D3DXVECTOR3(1.0f, -1.0f, 0.0f); // Bottom right.
vertices[2].Color = D3DXVECTOR4(0.0f, 0.0f, 1.0f, 1.0f);
unsigned long * indices = new unsigned long[IndexCount];
indices[0] = 0; // Bottom left.
indices[1] = 1; // Top middle.
indices[2] = 2; // Bottom right.
D3D10_BUFFER_DESC vbd;
vbd.Usage = D3D10_USAGE_DEFAULT;
vbd.ByteWidth = sizeof(Vertex_PosCol) * VerticeCount;
vbd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = 0;
vbd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA vertexData;
vertexData.pSysMem = vertices;
HRESULT result = this->GDM.Device->CreateBuffer(&vbd, &vertexData, &VertexBuffer);
UINT stride = sizeof( Vertex_PosCol );
UINT offset = 0;
if(FAILED(result))
{
bool b = false;
}
D3D10_BUFFER_DESC ibd;
ibd.Usage = D3D10_USAGE_DEFAULT;
ibd.ByteWidth = sizeof(unsigned long) * IndexCount;
ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA indexData;
indexData.pSysMem = indices;
result = this->GDM.Device->CreateBuffer(&ibd, &indexData, &IndexBuffer);
if(FAILED(result))
{
bool b = false;
}
delete [] vertices;
delete [] indices;
затем в моей функции Draw () я установил буферы вершин и индексов и примитивную топологию, а также схему ввода для этого конкретного буфера. Затем я рисую трехмерную сцену, а затем текст. Вот код функции Draw ():
void Draw()
{
this->GDM.Clear(Color(100, 149, 237));
this->GDM.Device->RSSetState(this->GDM.RasterizerState);
this->GDM.Device->OMSetBlendState(this->GDM.BlendState, 0, 0xffffffff);
this->GDM.EnableZBuffer(true);
static float r;
D3DXMATRIX w;
D3DXMatrixIdentity(&w);
//D3DXMatrixRotationY(&w, r);
r += 0.01f * (3.14f / 180.0f);// * (float)Time->Scalar;this->effect.WorldMatrix->SetMatrix(w);
this->effect.ViewMatrix->SetMatrix(viewMatrix);
this->effect.ProjectionMatrix->SetMatrix(projectionMatrix);UINT stride = sizeof(Vertex_PosCol);
UINT offset = 0;
this->GDM.Device->IASetVertexBuffers(0, 1, &this->VertexBuffer, &stride, &offset);
this->GDM.Device->IASetIndexBuffer(this->IndexBuffer, DXGI_FORMAT_R32_UINT, 0);
this->GDM.Device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
//this->GDM.Device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINESTRIP);
this->GDM.Device->IASetInputLayout(Vertex_PosCol::GetInputLayout());
D3D10_TECHNIQUE_DESC techDesc;
this->effect.Technique->GetDesc( &techDesc );
for (int p = 0; p < techDesc.Passes; p++)
{
this->effect.Technique->GetPassByIndex( p )->Apply( 0 );
this->GDM.Device->DrawIndexed(3,0,0);
}
this->GDM.EnableZBuffer(false);
this->sBatch->Begin();
if (loaded)
{
this->sBatch->Draw(
s1,
this->Input->Mouse.Position.x,
this->Input->Mouse.Position.y,
200,
200,
45.0f * (3.14f / 180.0f));
this->sBatch->Draw(s2, x, y, 200, 200);
}
this->sBatch->End();
SS << "Graphics Test And Development" << "\n";
SS << "FPS: " << this->Time->FPS << "\n";
SS << "X: " << x << "\n";
SS << "Y: " << y << "\n";
RECT rc = {5, 5, 0, 0};
this->TR.RenderText(this->SS.str().c_str(), 5, 5, &Color(0.0f, 1.0f, 0.0f, 1.0f));
this->SS.str("");
}
Я потратил на это гораздо больше времени, чем следовало бы из-за глупых ошибок. Когда я создал буферы, я создал объект D3D10_SUBRESOURCE_DATA для каждой вершины и индексного буфера, но я забыл установить их, и в результате у меня вообще не было 3D-сцены.
С текущим методом рендеринга 3D-сцены, который я использую, D3DX10_SPRITE_SAVE_STATE в качестве флага в LPD3DX10SPRITE.Begin (), насколько я могу судить, не является необходимым, но я собираюсь оставить его независимо, если только это не вызовет проблем с производительностью, но я сомневаюсь, что так будет всегда.
В любом случае, я понимаю, что простого «эй, я изменил это, и это работает», возможно, было достаточно для ответа, но я хотел быть тщательным. Надеется, что это помогает кому-то!
Других решений пока нет …