Transcript DirectX

DirectX
2009.01.29
レクチャー
DirectXとは
 Windowsのマルチメディア機能を強化するために
MicroSoftが提供している拡張API群。
 C++
 Other managed languege(C#、Basic、etc・・・)
 アプリケーションが直接ハードウェア制御を行うこと
が可能となるため、高度なマルチメディア処理を実
現することができる。
DirectXの主要コンポーネント群
 DirectX Graphics
 DirectDraw ・・・2次元グラフィックス処理
 Direct3D ・・・3次元グラフィックス処理
 DirectSound ・・・音楽再生・録音
 DirectShow ・・・ビデオファイル等の再生・作成
 DirectInput ・・・キーボード・マウス等の入力
 今回はDirect3Dに焦点を置いて説明する
開発環境準備
 DirectX SDKの入手
 VisualStudioの設定
 ライブラリの設定
 インクルードファイルの設定
 依存ファイルの設定
開発環境準備
 DirectX SDKの入手
 MicroSoftのHPからDirectX SDKをダウンロード
http://www.mictrosoft.com/japan/windows/directx/default.mspx
 合わせてDirectXのヘルプも入手するとよい
 インストーラに従ってインストールを行う
VisualStudioの設定
 ライブラリの設定
 DirectXをインストールしたフォルダ内の\Lib\x86を追加
する
VisualStudioの設定
 インクルードファイルの設定
 DirectXをインストールしたフォルダ内の\Includeを追加
する
VisualStudioの設定
 依存ファイルの設定
 プロジェクトのプロパティを開き、[リンカ]→[入力]から[追加
の依存ファイル]に必要なlibファイルを追加する
DirectXプログラムサンプル
 DirectXSDKには豊富なサンプルが付属している
 暇なときにでもどぞ
DirectXの基本
 DirectXを使ったプログラムはWindowsアプ
リケーション
 よって、プログラムの書き方もWindowsアプリ
ケーションに準拠
 描画処理の大半はメッセージループ内に記述される
DirectXプログラムの流れ
 DirectXの初期化
 Direct3Dインターフェイスの作成
 3Dデバイスインターフェイスの作成
 描画処理





3Dモデルの用意
ワールド空間への配置
カメラ座標を決める
射影変換
レンダリングして表示する
DirectXの初期化
 DirectX3Dインターフェイス
 ビデオチップの性能を調べたり、他のインターフェ
イスのインスタンスを作成したりするメソッドを
持っている
 一番最初に作成する必要がある
 3Dデバイスインターフェイス
 実際の描画処理に関わるメソッドのほとんどを
持っている
描画処理
 3Dモデルの用意
 頂点バッファを使う方法とメッシュを使う方法とが
ある
 頂点バッファを使う方法は、ポリゴンの頂点一つ
一つをコーディングで設定する
 メッシュは頂点バッファの機能を拡張したもので、
外部の3Dモデルファイルを読み込んで表示する
ことができる
描画処理
 ワールド空間の用意
 用意した3Dモデルを配置するため、コンピュータ
上の仮想空間を用意する
 すでにワールド座標系自体は3Dデバイス内に存
在するため、3Dモデルの材質(マテリアル)や光
源(ライティング)の設定を行う。
描画処理
 3Dモデルをワールド空間へ配置
 設定したワールド空間に、3Dモデルを移動・回
転・拡大縮小して配置する
 この処理をワールド変換と呼ぶ
 ワールド変換にはワールド変換行列を用いる
描画処理
 カメラ座標を決める
 実際に画面に表示される画像を計算するために、
ワールド空間内に「カメラ」を配置する
 カメラの位置、向き、注目点をベクトルで設定する
 カメラに見えている3D空間画像を計算する。この
処理をビュー変換と呼び、行列を用いて行われる。
描画処理
 射影変換
 カメラに移った3Dモデルの座標系を、画面に表示
できるように二次元座標系に変換する
 この変換も行列で行われる
描画処理
 レンダリングして表示する
 実際に3Dモデルを描写する
 得られた画像はワールド変換、ビュー変換、射影
変換を通して2次元座標系に直され、最終的にピ
クセルデータに変換(ラスタライズ)されて画面に
表示される。
課題
 課題1
 このスライドで使用したサンプルプログラムを実
際に起動すること
 課題2
 サンプルプログラムの内容を自由に改変してみ
ること。
課題
 課題1
 DirectXでの処理部分を空白にしたWindowsプ
ログラムのソースがある
 DirectXでの処理をスライドでの説明プロセスご
とにまとめたソースコードを用意してある
 それらを切り貼りして、提示したサンプルプログラ
ムをそれぞれのPC上で動作させること。
課題
 課題2
 サンプルプログラム内で使用されている関数の
引数の値をいじって、結果が実行画面にどのよう
な影響を及ぼすかを確認すること。
 改変後のプログラムを提出すること。
補足
 今回の課題で用いる依存ファイル





d3dxof.lib
dxguid.lib
d3dx9d.lib
d3d9.lib
winmm.lib
 以上のlibファイルをプロジェクトのプロパティから
[リンカ]→[入力]→[追加の依存ファイル]に追加する
補足
 Q.なぜDirectXは座標変換に行列を用いるのか?
 A.計算式がとても単純になるから。
 行列を用いると移動・回転・拡大縮小全ての処理が
(頂点座標) × (変換行列)で表すことができる
↓回転行列の例
補足
 例・3Dモデルを平行移動させ、次にx軸を中心に回転させ、そ
の後再び平行移動する3D画像処理の演算
行列を使わない場合
頂点1の座標を足し算
頂点1の座標をθ度回転
頂点1の座標を足し算
頂点2の座標を足し算
頂点2の座標をθ度回転
頂点2の座標を足し算
頂点3の座標を足し算
頂点3の座標をθ度回転
頂点3の座標を足し算
・・・・・
行列を使う場合
変換行列を作成
頂点1の座標に行列を掛ける
頂点2の座標に行列を掛ける
頂点3の座標に行列を掛ける
・・・・・