DirectX再入門

ああ、もう、自分のためのメモ書きです、、(´Д`;

DirectXGraphicsにおけるレンタリングパイプライン

  • バイス:IDirect3D9(デバイス作成)
  • 入力1 :IDirect3DVertexBuffer9(ポリゴンデータ)
  • 入力2 :IDirect3DTexture9(テクスチャ画像)
  • 処理  :IDirect3DDevice9(デバイス
  • 出力  :IDirect3DSurface9(サーフェース)

※IDirect3DSurface9は二次元画像を格納するメモリ空間であるため、
レンタリング結果をIDirect3DTexture9に書き込むことも可能。

モデルの表現

  • D3DPT_TRIANGLELIST(トライアングルリスト):頂点数が多め
  • D3DPT_TRIANGLEFAN(トライアングルファン):凸表現が得意だが凹表現が苦手

Xファイル

三次元モデルの形状データが「メッシュ」形式で格納されている。
1つのXファイルに「メッシュ」は複数格納できる。
「メッシュ」は色・質感といった情報を持つ。

DirectXGraphicsを使った3Dオブジェクトの表示

  1. 頂点バッファの構築(CreateVertexBuffer)
  2. 頂点バッファデータの作成
    1. FVFの場合
      1. 構造体の宣言
      2. 頂点バッファのロック
      3. データの設定(座標・色)
      4. 頂点バッファのアンロック
    2. Xファイルの場合
      1. XファイルをLPD3DXMESH/LPD3DXBUFFERに読み込み
  3. 頂点バッファの描画
    1. レンタリングパイプラインに設定(SetStreamSource)
    2. ビュー行列、射影行列の設定
    3. FVFの場合
      1. FVFフォーマット設定(SetFVF)
      2. プリミティブ描画(DrawPrimitive)
    4. Xファイルの場合
      1. ワールド行列の設定
      2. マテリアルの取り出し・コピー・セット
      3. 描画(LPD3DXMESH->DrawSubset)

マトリクス周りの関数

D3DXMatrixIdentity(D3DXMATRIX*)
何もしないマトリクス(単位行列)作成
IDIRECT3DDEVICE9->SetTransform(D3DTS_VIEW, D3DXMATRIX*)
ビュー行列をレンタリングパイプラインに設定
IDIRECT3DDEVICE9->SetTransform(D3DTS_PROJECTION, D3DXMATRIX*)
射影行列をレンタリングパイプラインに設定
IDIRECT3DDEVICE9->SetTransform(D3DTS_WORLD, D3DXMATRIX*)
ワールド行列をレンタリングパイプラインに設定
D3DXMatrixTranslation(D3DXMATRIX*, x, y, z)
マトリクスの移動
D3DXMatrixScaling(D3DXMATRIX*, x, y, z)
マトリクスの拡大縮小
D3DXToRadian(angle)
角度をラジアンに変換
D3DXMatrixRotationX(D3DXMATRIX*, rad)
マトリクスをX軸を中心に回転
D3DXMatrixRotationY(D3DXMATRIX*, rad)
マトリクスをY軸を中心に回転
D3DXMatrixRotationZ(D3DXMATRIX*, rad)
マトリクスをZ軸を中心に回転
D3DXMatrixRotationAxis(D3DXMATRIX*, D3DXVECTOR3*, rad)
任意の軸(D3DXVECTOR3)でマトリクスを回転
D3DXMatrixMultiply(*dst, *src1, *src2)
src1とsrc2を合成した行列dstを取得する
D3DXMatrixLookAtLH(*view, *pos, *direction, *gradient)
カメラ(ビュー)行列の位置・向き・傾きを設定
D3DXMatrixPerspectiveFovLH(*proj, rad, aspect, near, far)
カメラのパラメータ(射影行列)の設定(カメラの画角アスペクト比・Nearプレーン・Farプレーン
D3DXVec3Normalize(*pOut, *pV)
ベクトルpVを正規化してpOutに設定する
IDIRECT3DDEVICE9->SetLight(index, *light)
ライトをレンタリングパイプラインに設定
IDIRECT3DDEVICE9->LightEnable(index)
index番のライトを有効にする

※ビュー行列と射影行列の設定関数の後ろのLHは「左手座標系」という意味。

カメラ周り

画角
小さくなるとズームイン・大きくするとズームアウト
アスペクト比
1.0fでレンタリングターゲットが正方形になる。大きいほど横長で、小さいほど縦長となる
Nearプレーン/Farプレーン
レンタリング範囲

IDIRECT3DDEVICE9::SetRenderState(D3DRENDERSTATETYPE state, DWORD value)

単一デバイスのレンダリングステートのパラメータを設定する。

@param state
変更対象のデバイスステート変数
@param value
デバイスのレンダリングステートの新しい設定値

D3DRENDERSTATETYPE列挙型

D3DRS_CULLMODE
カリングの計算を行う。D3DCULL_NONEでカリングしない。
D3DRS_ZENABLE
深度バッファ(Zバッファ)の設定。TRUE/FALSEを設定。
D3DRS_DITHERENABLE
ディザリングの設定。TRUE/FALSEを設定。
D3DRS_LIGHTING
ライティングの有効無効の設定。TRUE/FALSEを設定。

カリング

ポリゴンに表裏を付けて、裏の場合は描画しない仕組み。