DirectX 10 3D сцена исчезает с 2D рисованием

По какой-то причине, за пределами моего понимания, моя 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("");
}

0

Решение

Как уже упоминалось в комментариях выше, установка 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 (), насколько я могу судить, не является необходимым, но я собираюсь оставить его независимо, если только это не вызовет проблем с производительностью, но я сомневаюсь, что так будет всегда.

В любом случае, я понимаю, что простого «эй, я изменил это, и это работает», возможно, было достаточно для ответа, но я хотел быть тщательным. Надеется, что это помогает кому-то!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]