C++ DirectX11 ゲームプログラミング プログラミング

ゼロから始めるDirectX11ゲームプログラミング入門 #2「DirectX11の初期化」

ハッカドールMMDデータ © 2015 DeNA Co.,Ltd.

DirectXを使おう!まずは準備

今回は実際にDirectXを使用して、画面に色を出していきたいと思います。

それをするためにソースファイルの作成などの準備をしましょう。

前回作成したものは「GameProgramming」フォルダに入っています。その中の「Application」フォルダにプロジェクトが入っているので、ここの中にソースファイルを作成しましょう。

しかし、今から作成するソースファイル全てをこのフォルダに入れてしまうとファイルが増えすぎて大変になってくるので、上図のように「Source」フォルダを作り「DirectXフォルダ」を作成して、その中にソースファイルを作成しましょう

今後ソースファイルを追加する時は、全てこの「Source」フォルダ以下に作成していきます。

新規テキストファイルでソースファイルを作成できたら、それをVisual Studioのプロジェクトに追加しよう。

追加の方法が分からない人は、以下のページを見てみてください。

下の図のようにできていればよいです!

「Source」や「DirectX」のようなフィルタを作成する方法は、「Application」を右クリックし「追加(D)」->「新しいフィルター(F)」

C++17を使用できるようにする

C++17の機能を使用するので、C++17を使えるように設定しておきましょう。

C++も年々バージョンが上がっていて、便利な機能がふえているのです。

Direct3Dの初期化

ではいよいよDirect3Dの初期化をしましょう。

Direct3Dとは様々な機能があるDirectXの中の、3Dグラフィックス機能のことです。
最近はDirect3Dしか更新されてないので、実質DirectX = Direct3Dのことです。

Direct3D.hに書くもの。

Direct3D.cppに書くもの。量が多い・・・

Direct3Dについて

突然すごく長いプログラムが出てきて戸惑うかと思います。Direct3Dを使用する準備は最低でもこのくらい記述が必要なのです・・・。

謎のプログラムを書き写しているだけでは力にならないので、ここでDirect3Dについて簡単にですが解説をしたいと思います。

まずDirect3D.hのクラスに用意した4つの変数について説明します。

  • Direct3Dデバイス
    ・・・グラフィックス関係の素材を創造できるのはこいつの役割。画像とかポリゴンとか、その他いろいろ作れるのはこいつ。
  • Direct3Dデバイスコンテキスト
    ・・・画像とかポリゴンとかの素材を使って、実際にBackBufferなどに絵を描くやつ。描画関係はこいつが主役。
  • SwapChain
    ・・・絵を描く時はいきなりウィンドウに描かない。一度裏画面であるBackBufferに描く(チラつきをなくすため)。その裏画面であるBackBufferとウィンドウを切り替え(表示す)る役割がこいつ。こいつがいないと画面に何も表示されない。
  • BackBufferView
    ・・・SwapChainが持っているBackBuffer(裏画面)にアクセスするためのハンドル。これがないと、BackBuffer(裏画面)を操作することができない。車で例えるなら、BackBufferが車本体で、BackBufferViewがその車を操作するためのハンドルみたいな感じ。ハンドルがないと車運転できないよね。
イメージ図

特によく使うのはデバイスコンテキストですね。描画に関することはこいつを使うことになります。

画像を作ったり、ポリゴン(頂点データ)を作ったりするときはデバイスの出番です。

シングルトンパターンについて

上記で作成したDirect3Dクラスは「シングルトンパターン」というプログラムの組み方をしています。

この組み方をすると、クラスの実体を2つ以上生成できないように制限し、さらにどこからでも使用できる便利なクラスになります。

ただしグローバル変数のように扱えてしまうので、多様は禁物です。

マネージャのように、1つだけ必要でどこからでも参照したいようなクラスに限り使用していきます。

ゲームループの作成

ゲームの世界は1秒間に数10~数100回の計算が高速で実行されています。常に計算や描画を実行し続けることによって、キャラクター達が動いたりして見えるわけなんです。ゲームループとは、その何度も何度も実行する処理のことです。

しかし、新規作成したこのプロジェクトでは、ゲーム用には作られておらずゲームループがありません。Application.cppの一部を書き換えて、ゲームループを作成しましょう。

下のプログラムのように、「メイン メッセージ ループ」の部分を全て消し「ゲームループ」の部分を書き足してください

「ゲームの処理を書く」と書いている場所に、毎回行いたい計算や描画を書いていきます。

Direct3Dクラスを動作させてみよう!

ようやくDirect3Dクラスを生成し動作させてみましょう。画面全体を青色で塗りつぶしてみて、きちんと動作するかテストです。

Application.cppのソースを全て記載しますが、文字背景色が付いている部分が追加した部分です。

解説

ここでDirect3Dクラスの実体を生成し、初期設定(Initialize)を実行することで使用可能な状態にしています。

ここはゲームループの中ですね。つまり何度も何度も実行される場所です。
まずcolorに青色のデータを作っています(光の3原色でRGBAの順番 全て1だと真っ白になる)。
次の行でデバイスコンテキストさんを使用してますね。描画の職人です。
こいつに「バックバッファをこの色で塗りつぶして!」と命令しています。
最後のPresentは、バックバッファに描かれた内容をウィンドウに表示する命令です。

実行結果

長い道のりでしたが、ようやく色が出ましたね!

まとめ

  • Direct3D.cppとDirect3D.hに、Direct3Dを動作させるためのプログラム(Direct3Dクラス)を書いた。
  • Application.cppでDirect3Dクラスの実体を生成し、実際に動作させる。
  • 画面の塗りつぶしは、デバイスコンテキスト(描画の職人)にお願いする。
  • ゲーム終了時には、Direct3Dクラスの実体を削除している。

おすすめ書籍

-C++, DirectX11, ゲームプログラミング, プログラミング
-, , , , ,