ねねチャレ 1日目「Directx11の初期化とwindow生成」

今日の目的

Directx11の初期化とwindow生成を行って、ゲームプログラムの下準備をします。

WindowAIP

本音を言えば、触りたくないAPIですがねねっちもwindow上で作っていたので仕方なく触りましょう。

ゲーム制作におけるwwindowsAIPに役割は、

  1. ウィンドウの作成
  2. OSからのメッセージに対応する

くらいでしょうか。

OSのAIPなのでやろうと思えば際限ありませんが、本質でないのでこの2つに絞っていきます。
今回用意した最小限のコードはこちらです。
gist.github.com

最低限です、ハイ。 この最低限のコードは3つの要素で構築されています。

ウィンドウプロシージャ : 5~28行目

 OSから送られてきたメッセージを処理します。
 ここのメッセージとは「閉じる」ボタンが押されたなどからマウス・キー入力など多岐にわたります。

動作と見た目の設定 : 30~77行目

 ウィンドウの位置・大きさから、プロシージャを始めとする多くの動作を設定します。

メッセージ対応 : 79~92行目

 プロシージャが受け取ったメッセージを取得し、対応しています。
 今回は「ESC」または「閉じる」が押された場合プログラムを終了するようにしています。

DirectX

WindowAPIとは異なり、こちらはガッツリ触っていきます。

DirectXに於けるゲームの役割は、

  • 描画 です(それ以外にも多々あるのですが今回は触れません)。

このDirectX描画に必要なGPU(etc)との仲介役になってくれるAPIです。
その描画に最低限必要なコードはこちら(Windowはクラス化されています)。

gist.github.com

このコードの要素も分析していきます。

バイスの生成 : 30~53行目
  これがAPIの実体です。リソースを生成したり、描画コマンド叩くのはこのデバイスを通して行われます。

スワップチェーンの作成 : 30~53行目
  フロントバッファとバックバッファを用意し交互に描画を行うことで高速化します。

バックバッファビュー取得とステンシル/デプスバッファの作成 : 55~77行目
  リソースにアクセスするインターフェースとしてビューと言う概念が導入されています。 ここでは、2で作成したバッファとそのステンシルバッファ用のビューを生成しています。

描画リソースの設定 : 80行目
  生成したリソースをビューを介してレンダリング対象に設定します。

ビューポート・ラスタライズの設定 : 82~99行目
  描画領域と描画(ポリゴンをピクセルにする)設定を行います。

バッファ初期化 : 116~118行目
  単色初期化することで前フレームの描画結果を破棄します。

バックバッファとフロントバッファの切替 : 120行目
  バッファを交換することで、バックバッファに書かれていたものを画面に出します。

注意点として、デバイスを始めとするリソースを開放する必要があります。(103~111行目)

まとめ

はい、疲れました。 2日に分けてやるべきでしたw

程度に覚えておけばいいと思います。
ココらへんのコードはググればすぐでます。
そんなこんなで1日目はこのへんで。
2日目は「GamePadの入力」を行う予定です。

進捗!

青いwindowが出るようになりました! f:id:himatyu:20180309021436g:plain github.com