32.Dx12版サンプルをDx11版に合わせて追加する(1)

今回は2つのDx12版サンプルをGitHubにアップしましたSimpleSample005,006です。
ドキュメントは申し訳ないですが、まだ記述してません。少しサンプルがたまった段階でアップします。

この記事は、
コミットSimpleSample015追加。ライブラリ修正あり
から、
コミットSimplaSample005,006(Dx12版)追加。ライブラリ修正あり
の間の作業です。
GitHubサイト

https://github.com/WiZFramework/BaseCross

を参照して下さい。

今回はこれまでDx11版のみだったサンプルに、Dx12版を追加したものです。
ですので実行イメージは、Dx11版の同じサンプル番号と同じになります。

今回アップしたサンプルのポイント紹介します。
なお、今回はライブラリも修正しています。Dx12版のライブラリです。今回は、ラスタライザステートブレンドステートデプスステンシルステートの動的変更の機能を追加しました。Dx12LibプロジェクトのDeviceResources.h/cppの変更になります。
Dx12版のライブラリは、まだまだ機能が不足していたり、安定してなかったりで、もう少し微調整が必要かと思います。Dx11版のサンプルに合わせて記述していくことで、徐々にその辺は問題点が明らかになるので、合わせて修正していきます。
今回は各レンダリングステートの動的変更を行う部分ですが、これはVSPSDrawContextのメンバ関数で実装しました。
このVSPSDrawContextクラスは描画処理をカプセル化したものですが、もう少し拡張性が必要かと感じています。(VSとPSしか扱えないのも、低機能な部分ですね)。
今回変更した、例えばブレンドステートVSPSDrawContext::SetBlendState関数にあります。引数によって2つの多重定義があります。
以下はconst BlendState Modeを引数にしたものの実体ですが


void VSPSDrawContext::SetBlendState(const BlendState Mode) {
    if (!m_PipelineState.Get()) {
        ThrowBaseException(
            L"パイプラインステートがまだ作成されていません",
            L"if (!m_PipelineState.Get())",
            L"VSPSDrawContext::SetBlendState()"
        );
    }
    D3D12_BLEND_DESC blend_desc;
    D3D12_RENDER_TARGET_BLEND_DESC Target;
    switch (Mode) {
    case BlendState::Opaque:
        blend_desc = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
        break;
    case BlendState::AlphaBlend:
        ZeroMemory(&blend_desc, sizeof(blend_desc));
        blend_desc.AlphaToCoverageEnable = false;
        blend_desc.IndependentBlendEnable = false;
        ZeroMemory(&Target, sizeof(Target));
        Target.BlendEnable = true;
        Target.SrcBlend = D3D12_BLEND_SRC_ALPHA;
        Target.DestBlend = D3D12_BLEND_INV_SRC_ALPHA;
        Target.BlendOp = D3D12_BLEND_OP_ADD;
        Target.SrcBlendAlpha = D3D12_BLEND_ONE;
        Target.DestBlendAlpha = D3D12_BLEND_ZERO;
        Target.BlendOpAlpha = D3D12_BLEND_OP_ADD;
        Target.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
        for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; i++) {
            blend_desc.RenderTarget[i] = Target;
        }
        break;
    case BlendState::Additive:
        ZeroMemory(&blend_desc, sizeof(blend_desc));
        blend_desc.AlphaToCoverageEnable = false;
        blend_desc.IndependentBlendEnable = false;
        ZeroMemory(&Target, sizeof(Target));
        Target.BlendEnable = true;
        Target.SrcBlend = D3D12_BLEND_SRC_ALPHA;
        Target.DestBlend = D3D12_BLEND_ONE;
        Target.BlendOp = D3D12_BLEND_OP_ADD;
        Target.SrcBlendAlpha = D3D12_BLEND_ONE;
        Target.DestBlendAlpha = D3D12_BLEND_ZERO;
        Target.BlendOpAlpha = D3D12_BLEND_OP_ADD;
        Target.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
        for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; i++) {
            blend_desc.RenderTarget[i] = Target;
        }
        break;
    case BlendState::NonPremultiplied:
        ZeroMemory(&blend_desc, sizeof(blend_desc));
        blend_desc.AlphaToCoverageEnable = false;
        blend_desc.IndependentBlendEnable = false;
        ZeroMemory(&Target, sizeof(Target));
        Target.BlendEnable = true;
        Target.SrcBlend = D3D12_BLEND_SRC_ALPHA;
        Target.DestBlend = D3D12_BLEND_INV_SRC_ALPHA;
        Target.BlendOp = D3D12_BLEND_OP_ADD;
        Target.SrcBlendAlpha = D3D12_BLEND_SRC_ALPHA;
        Target.DestBlendAlpha = D3D12_BLEND_INV_SRC_ALPHA;
        Target.BlendOpAlpha = D3D12_BLEND_OP_ADD;
        Target.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
        for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; i++) {
            blend_desc.RenderTarget[i] = Target;
        }
        break;
    default:
        blend_desc = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
        break;
    }
    m_PineLineDesc.BlendState = blend_desc;
    m_PipelineState = PipelineState::CreateDirect(m_PineLineDesc);
}

このように、透明処理、Additive処理、オペック(塗りつぶし)など、ブレンドの方法を定義します。
引数になってる、BlendStateenum classになっていて、いくつかのパターンで修正可能です。このほかにconst D3D12_BLEND_DESC&を引数に渡す処理は、プログラマが自由にブレンドステートを実装できます。
以下のような実体です。


void VSPSDrawContext::SetBlendState(const D3D12_BLEND_DESC& State) {
    if (!m_PipelineState.Get()) {
        ThrowBaseException(
            L"パイプラインステートがまだ作成されていません",
            L"if (!m_PipelineState.Get())",
            L"VSPSDrawContext::SetBlendState()"
        );
    }
    m_PineLineDesc.BlendState = State;
    m_PipelineState = PipelineState::CreateDirect(m_PineLineDesc);
}


このように、直接ブレンドの方法を設定できるので、いくらか自由度は高まったかと思います。

それでは、今回はこの辺で。
次回も、これまで作ってきたDx11版サンプルDx12版に対応させる作業となります。次回もよろしくお願いします。

カテゴリー

ピックアップ記事

  1. 2016092201
    今回は前回のサンプルを少し機能を追加しまして、いろんなオブジェクトを追加しています。FullTuto…
  2. 2016092001
    前回更新から時間がたってしまいましたが、今回はフルバージョンチュートリアル003をアップしました。内…
  3. eyecatch
    前回更新から時間がたってしまいましたが、今回はフルバージョンチュートリアル002で懸案となっていまし…
PAGE TOP