2012年6月21日木曜日

ヘッダファイルのインクルード

バージョンについて
ここではDirect3D11のチュートリアルを例に取ります。Direct3D10の場合は11の部分を10に置き換え、Direct3D10.1の場合は10_1に置き換えます。ただしD3DXに関してはD3D10.1で使うのもD3D10XでOKです。


Direct3D11のTutorial01.cppは次のファイルのインクルードから始まっています。
#include <windows.h>
#include < d3d11.h >
#include < d3dx11.h >
#include "resource.h"

各ファイルの意味は次の通りです。

<windows.h>

ウインドウズの基本的なプログラミングに必要な機能を使えるようにします。仮にDirect3Dを使わないとしてもウインドウを出す以上は必要なヘッダです。ウインドウの作成のほか、プログラミングを補助する機能が色々入った他の重要なファイルを内部でインクルードしています。下で説明するd3d11.hの中でもこれがインクルードされています。そのためここでインクルードしなくてもコンパイルできます。

< d3d11.h >  

Direct3D11の機能を使うために必要なヘッダです。なおd3d11(D3D11)とはDirect3D11の略称であり、ライブラリや関数の名前などにもこの略称が使われています。

< d3dx11.h >

Direct3DX11(略称d3dx11)というライブラリを使うためのヘッダファイルです。一文字違いでややこしいですがd3d11を補助するライブラリです。D3Dのプログラム作る場合は大抵D3DXも必要になるものですが、Tutorial01はウインドウを青く塗りつぶすだけなので実は不要です。

#include "resource.h"

メニュー、アイコン、ボタン等のウインドウズのGUIリソースを読み込むためのファイルです。VC++でプロジェクトを作ると勝手に生成されたりする奴です。Direct3Dにもリソースという用語や概念がありますが、それとは無関係です。
-----細かい話------
チュートリアルではこのタイプのリソースはアイコンしか使わないのでこのインクルード文を消して代わりに

#define IDI_TUTORIAL1 107
と書いて、プロジェクトのフォルダにあるTutorial01.rcをメモ帳で開いてそ次の2行
#include "resource.h"
IDI_TUTORIAL1 ICON "directx.ico"
だけを残して残りを全部消去してもビルドできると思います。
この時、ついでに directx.icoの部分を自分で作成したアイコンファイル名に書き換えて自分のアイコンファイルをプロジェクトのフォルダに入れておけばそのアイコンが実行ファイルに組み込まれるはずです。
ちなみにリソースやアイコンについてはWin32APIプログラミングにおけるInitWindowのページにも書きました。

なお、InitWindow()のウインドウクラス構造体でアイコンに関わる2つのメンバ( wcex.hIconとwcex.hIconSm)をNULLにしておけばシステムデフォルトのアイコンが表示されますが、この場合もresource.hをインクルードする必要はありません。
------------------

関数や定数や型の名前について

さて、Direct3Dによるプログラミングにはd3dというライブラリ以外にもd3dxとwindows.hが必要だという事が分かりました。これは逆に言えば、ソースコード中に登場する関数や型の名前は、これら3つの機能群のうちのどこかで定義されている可能性が高い訳です。
D3Dで使われる名前は頭にD3Dが、D3DXで使われる名前は頭にD3DXが付いていて、windows.hで使われる名前はそれらのいずれも付いないので所属を推察するのは容易です。
例)
D3D11_VIEWPORT → D3Dに所属
ID3D11Device        → D3Dに所属
D3DX11CompileFromFile() →D3DXに所属
CreateWindow() → windows.hに所属
WNDCLASSEX  →  windows.hに所属
HWND        →  windows.hに所属

  要点

一般的なwindowsプログラミングに必要な機能はwindows.hにまとまっています。tutorial 01はウインドウを出して一色に塗りつぶすだけの単純なプログラムなので本来Direct3Dの機能は不要ですが、今後のチュートリアルで Direct3D11の機能を使った描画を行うために、ビデオカードやウインドウの関連付け、及びDirect3D11の初期化処理の目的でd3d11.hをインクルードしていると言えます。

0 件のコメント: