私はD3D11を使ったゲームプログラミングの基本についての本をフォローしています。Direct3Dの絶対的な基本を理解しました:)
しかし...質問があります。この本では、私は常に一度に1つのデモを作成する必要がありました。今、私はそれを使って2Dゲームを作ろうとしています。悪い習慣に慣れたくないのでアドバイスが必要です。
この本では、常に(texcoordとpositionメンバーを使用してVertexPosを構築する)OR(XMFLOAT3ポジションメンバーのみを使用してVertexPosを構築する)を定義する必要がありました。私が作成しているゲームでは、テクスチャのないソリッドサーフェスとテクスチャのあるサーフェスの両方を描画できるようにしたいと考えています。これを効率的に行うことは言うまでもなく、これを行う方法がわかりません。
これが私のレンダリング関数です:
void GameSpriteDemo::Render()
{
if (m_pD3DContext == 0)
{return;}
float ClearColor[4] = {0.0f, 0.0f, 0.25f, 1.0f};
m_pD3DContext->ClearRenderTargetView(m_pBackBufferTarget,ClearColor);
UINT stride = sizeof(VertexPos);
UINT offset = 0;
m_pD3DContext->IASetInputLayout(m_pInputLayout);
m_pD3DContext->IASetVertexBuffers(0,1,&m_pVertexBuffer, &stride, &offset);
m_pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
m_pD3DContext->VSSetShader(m_pSolidColorVS,0,0);
m_pD3DContext->PSSetShader(m_pSolidColorPS,0,0);
m_pD3DContext->PSSetShaderResources(0,1,&m_pColorMap);
m_pD3DContext->PSSetSamplers(0,1,&m_pColorMapSampler);
for(int i=0; i < 2; ++i)
{
XMMATRIX world = m_Sprites[i].GetWorldMatrix();
XMMATRIX mvp = XMMatrixMultiply( world, m_VpMatrix );
mvp = XMMatrixTranspose(mvp);
m_pD3DContext->UpdateSubresource(m_pMvpCB,0,0,&mvp,0,0);
m_pD3DContext->VSSetConstantBuffers(0,1,&m_pMvpCB);
m_pD3DContext->Draw(6,0);
}
m_pSwapChain->Present(0,0);
}
では、複数の頂点バッファー、入力レイアウト、シェーダー、ブレンダーなどを使用して、これをどのように効率的に処理する必要がありますか?
それらの複数のバージョンを作成し、Draw呼び出しの後に入力アセンブリ、シェーダーなどをリセットするように設定する必要がありますか?またはこれは機能しません/これは効率的ではありませんか?
ありがとう :)