26.シンプルサンプル002,003

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

この記事は、
コミットSimpleSample001の追加。ライブラリ修正あり
から、
コミットSimpleSample002,003追加。ライブラリ修正あり
の間の作業です。
GitHubサイト

https://github.com/WiZFramework/BaseCross

を参照して下さい。

また、ブログ記事全体に、Dx12に関する研究、考察がよく出てきます。
Dx12に関する情報は、マイクロソフト社のDirectX-Graphics-Samplesが主な情報源となります。

マイクロソフト社のDirectX-Graphics-SamplesのGitHubサイトは以下になります。

https://github.com/Microsoft/DirectX-Graphics-Samples

ぜひ、興味ある方はダウンロードしてみてDx12研究を始めるといいと思います。

SimpleSample002について

実行結果は以下のようになり、これはDx11版もDx12版も変わりません。

2016081901

このサンプルのテーマは三角形スプライトをコンスタントバッファにより動かすということです。
BaseCrossにおけるスプライトとは2次元のオブジェクトという意味です。そのほかに3次元上の2次元オブジェクトもあります。

このコミットでライブラリ修正はいりまいた理由は、Dx12版における、コンスタントバッファのみ持つルートシグネチャ作成時に、ピクセルシェーダにもコンスタントバッファを設定しなければならなかったのですが、頂点シェーダのみコンスタントバッファ設定になっていました。
このあたり、Dx12はまさにGPUに直接関係するなあ、と思う次第です。

そういえば、Dx12版の描画メカニズムについては、複数の記事にわたって説明を記述してきましたがDx11版については、ほとんど記述してないことを思い出しました。
Dx11版についてはある程度サンプルが出そろったところで説明したいと思います。
またDx11についての情報は、いろんなブログでも紹介されてますし、参考書も数多くあります。ですので、それらを合わせながらコードを読んでいただくと、理解できると思います。

現時点で、やっぱり研究すべき課題はDx12版と思っています。

もう一つ、このサンプルで移動させている三角形はコンスタントバッファにデバイス座標を直接入れているということです。
ここは理解しておくといいかもしれません。Dx12版、Dx11版ほぼ共通の処理として、ワールド行列をコンスタントバッファに設定する処理があります。以下はDx12版です。


void TriangleSprite::OnDraw() {
    //コンスタントバッファの準備
    m_SpriteConstantBuffer.Emissive = Color4(0.0f, 0.0f, 0, 1.0f);
    Matrix4X4 mat;
    mat.TranslationFromVector(m_Pos);
    m_SpriteConstantBuffer.World = mat;
    //中略
}

以下はDx11版です


void TriangleSprite::OnDraw() {
    //中略

    //コンスタントバッファの準備
    SpriteConstantBuffer sb;
    sb.Emissive = Color4(0.0f, 0.0f, 0, 1.0f);
    Matrix4X4 mat;
    mat.TranslationFromVector(m_Pos);
    sb.World = mat;

    //中略


}

いずれもmat.TranslationFromVectorというMatrix4X4のメンバ関数を使って行列を作成しています。これはビュー行列や射影行列を使わずに、デバイス座標の単位でワールド行列を作成しています。
これと、スクリーン座標(つまりスクリーンのピクセル)単位で実装されたものを、射影変換をかけてデバイス座標に変換する方法が、SimpleSample003ということになります。
ぜひその違いを理解してください。

SimpleSample003について

このサンプルは、002と同じスプライトの描画ですが、コンスタンバッファに渡す行列が違います。また、三角形ではなく、四角形を作成して、インデックスバッファを使って描画しています。(インデックスバッファについては、記事の前のほうで説明しました。)
実行イメージは以下のようになります。

2016081902

以下に、コンスタントバッファに渡す行列を作成しているところをピックアップします。以下はDx12版です。


void SquareSprite::OnDraw() {
    //行列の定義
    Matrix4X4 World, Proj;
    //ワールド行列の決定
    World.AffineTransformation2D(
        m_Scale,            //スケーリング
        Vector2(0, 0),      //回転の中心(重心)
        m_Rot,              //回転角度
        m_Pos               //位置
    );
    //射影行列の決定
    float w = static_cast<float>(App::GetApp()->GetGameWidth());
    float h = static_cast<float>(App::GetApp()->GetGameHeight());
    Proj.OrthographicLH(w, h, -1.0, 1.0f);
    //行列の合成
    World *= Proj;
    //コンスタントバッファの準備
    m_SpriteConstantBuffer.Emissive = Color4(0.0f, 0.0f, 0, 1.0f);
    m_SpriteConstantBuffer.World = World;

    //中略
}

以下はDx11版です


void SquareSprite::OnDraw() {
    //中略

    //行列の定義
    Matrix4X4 World, Proj;
    //ワールド行列の決定
    World.AffineTransformation2D(
        m_Scale,            //スケーリング
        Vector2(0, 0),      //回転の中心(重心)
        m_Rot,              //回転角度
        m_Pos               //位置
    );
    //射影行列の決定
    float w = static_cast<float>(App::GetApp()->GetGameWidth());
    float h = static_cast<float>(App::GetApp()->GetGameHeight());
    Proj.OrthographicLH(w, h, -1.0, 1.0f);
    //行列の合成
    World *= Proj;

    //コンスタントバッファの準備
    SpriteConstantBuffer sb;
    //エミッシブ加算は行わない。
    sb.Emissive = Color4(0, 0, 0, 0);
    //行列の設定
    sb.World = World;
    //コンスタントバッファの更新
    pD3D11DeviceContext->UpdateSubresource(CBSprite::GetPtr()->GetBuffer(), 0, nullptr, &sb, 0, 0);

    //中略

}

このように、Matrix4X4クラスの、AffineTransformation2D関数でワールド座標を求め、OrthographicLH関数で射影行列を求めてます。
ワールド行列に射影行列を掛けたものが、コンスタントバッファに設定する行列になります。こうすることで、座標系は(ポジションやスケーリングなど)は、スクリーンのピクセル座標と同じになります。

今回は、主に座標変換に触れました。ようは、オブジェクトをどのような計算方法でデバイス座標に変換するかというのが座標変換となります。

3Dオブジェクトの場合は、ここにカメラが入りますので、ビュー変換が必要になります。

それではこの項終了します。
次回もよろしくお願いします。

カテゴリー

ピックアップ記事

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