ホームに戻る
 Direct3Dメモ

1、はじめに

Direct3D はハードウェア処理によって3D描画の高速化を図る。
ビデオカードが Direct3D に対応していなければ、
ソフトウェアエミュレートされるので高速化が見込めなくなる。

Direct3D の利点

3D描画ライブラリ。
ハード上のデプスバッファやステンシルバッファ、テクスチャ。
バックバッファと垂直同期でのフリップの使用。
DirectDraw で困難なαブレンドが容易。
ビデオカード上のCPU(GPU)での頂点と光源処理の計算。
頂点バッファ、ジオメトリブレンディング、シェーダの利用。

発展中の技術なのでバージョン間の差やハードのサポートの差に注意が必要。

2、初期化

まずDirect3Dを初期化します。
ステータスとしてはバックバッファ、デプスバッファなどの設定をします。
初期化に際して T&L と HAL と HEL の3つを選択できます。
T&L は Transform と Lighting のことで頂点処理と光源処理をハードで行うものです。
HAL はハードがドライバで対応することでビデオカード間の差を解消する仕組み。
HEL は HAL と対する位置に存在しソフトウェアエミュレーションになります。

よって初期化は T&L と HAL でまず行い。
初期化できなければ HAL のみとし、これでもダメなら HEL とする。
HEL であれば処理は遅いが動作する可能性は一番高い。

3、3D描画

3D描画について視点、物体の移動、回転、拡大などの操作は仮想のものである。
実際は1つの変換行列によって世界を移動させているにすぎない。
(例えば物体を左に動かすために世界を右に動かすなど)

まず、視点と方向、仮想3D空間を設定する。
頂点フォーマットを設定する。
頂点フォーマットとは座標や色やテクスチャ座標など、
ある1つの頂点が持つ情報のフォーマット。
変換行列の操作(移動、回転など)。
変換行列と視点を考慮した頂点処理による頂点位置の演算。
頂点位置と光源位置から算出するその頂点における光源情報を演算。
頂点位置、光源情報、テクスチャ、各種バッファを考慮したピクセルの描画。

以上が描画過程となる。

テクスチャに関しては一部のビデオボードが累乗のテクスチャに限定されることから、
64×64など累乗のテクスチャを使うことが推奨される。

4、頂点バッファ

頂点バッファを用いない場合は頂点データはシステムメモリに存在する。
システムメモリに存在することでビデオカードへの転送時間のロスが生じる。
頂点バッファは頂点データをハード上に記録することができる。
同時に頂点をつなぐ順番を保持するインデックスバッファもハード上に記録する。
ハード上に記録するため書き換えにはロック、アンロックといった手順をふむ。

もちろんハード上での処理を想定するので、
頂点計算はハード上で行わなければ頂点バッファの利点は損なわれる。

5、ジオメトリブレンディング

変換行列のブレンドを行うことができる。
まず頂点フォーマットに重みの要素を加える。
重みは 0.0 から 1.0 の間で設定し 0.0 だと影響を受けず 1.0 だと全て受ける。
ここで1つの物体について中身の頂点の重みを部分的に変えることで、
例えば回転の変換行列のブレンドによって物体をあたかも曲げるような効果を期待できる。

回転を例にすると、まず原点を中心とした横に置いた棒状の物体を想定する。
左半分の重みを 0.0 とし右半分の重みを 1.0 とする。
このときジオメトリブレンディングによって時計周りに回転すると、
時計回りに物体の右半分だけが回転する。
この利点の1つに曲がる部分での物体の継ぎ目が不自然にならないことがある。
継ぎ目がより不自然にならないように重みを 0.0 と 1.0 の間で調節できる。

6、シェーダ

シェーダには頂点シェーダとピクセルシェーダがあります。
シェーダ機能にはシェーダ用のレジスタとシェーダ用の命令が存在し、
あたかもアセンブラを書くような記述方法を採用しています。
シェーダでは頂点単位もしくはピクセル単位で加工を施すことができます。
シューダのバージョンを指定するような過程も存在するので注意が要ります。
新たに HLSL というアセンブラ風で無い別の方法もでてきましたので、
アセンブラ風シェーダも昔のものになるかもしれません。

inserted by FC2 system