質問

D3D11を使用したゲームプログラミングの基本についての本をフォローしています。私は今、direct3dの絶対的な基本を理解しています:)

しかし...私には質問があります。本の中で、私はいつも一度に1つのデモをしなければなりませんでした。今、私はそれで2Dゲームを作ろうとしています。悪い習慣に慣れたくないので、あなたのアドバイスが必要です。

本の中で、私は常に(texcoordと位置のメンバーを備えたstruct vertexpos)または(xmfloat3位置のメンバーのみを持つstruct 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);
}

それでは、複数の頂点バッファー、入力レイアウト、シェーダー、ブレンダーなどでこれを効率的に処理するにはどうすればよいですか?

それらの複数のバージョンを作成するだけで、ドローコールの後に入力アセンブリ、シェーダーなどをリセットする必要がありますか?または、これは機能しません/これは効率的ではありませんか?

ありがとう :)

役に立ちましたか?

解決

簡単な答えは、はいです。複数の頂点バッファー、入力レイアウト、シェーダーなどを作成し、それぞれの対応するドローコールの前に適切なレイアウトを設定する必要があります。これは機能し、合理的に効率的です(最新のハードウェアの2Dゲームには十分に効率的である必要があります)。

完全な3Dゲームエンジンでは、物事はもう少し複雑になる傾向があります。通常、レンダリングエンジンには、頂点やインデックスバッファー、入力レイアウト、シェーダーなどのプリミティブオブジェクトの上にレイヤー化された抽象化の追加レベルがあります。

物事を構築する合理的に一般的な簡単な方法は、すべての頂点バッファー、インデックスバッファー、入力レイアウト、シェーダー、テクスチャなどを知っているメッシュクラスを持つことです。シングルドローコールで、それらすべてを設定する責任があります(多くの場合、ブレンドモード、カリングモードなどのレンダリング状態の他のビットとともに)、対応するドローコールを発行します。

デバイス状態の変更に関連するコストがかかるため、レンダリングエンジンは、必要な状態の変更の数を最小限に抑えるために、特定のフレームに描画する必要があるすべてのオブジェクトを試してソートするように設計されていることがよくあります。たとえば、Dawn of War 2レンダラーでは、すべてのメッシュジオメトリをソートして、すべての宇宙海洋ヘルメットを最小限の状態変更で描画することができます。等

最新の3DハードウェアとAPIは、過去よりも変化する状態のオーバーヘッドがやや少ないため、状態の変更を最小限に抑えるためのソートは以前よりも少し重要ではありませんが、PCで最大のパフォーマンスを得る必要があるゲームの一般的な慣行です。

肌のアニメーション、地形、粒子システム、フルスクリーンエフェクト、2D UIなどとともに、柔軟な照明と材料モデルをサポートするデータ駆動型レンダリングエンジン。最大の効率で描画できるように並べ替えると、非常に複雑になり、物事を構築するためのさまざまなアプローチがあります。 「レンダラー状態管理」として分類できるすべてのコードは、しばしば典型的なレンダリングエンジンでコードのかなりの部分を構成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top