HLSLwithoutEffects サンプル

HLSLwithoutEffects では、D3DX エフェクト インターフェイスを使用せずに、HLSL を使用して頂点シェーダーを記述する方法を示しています。HLSL は、構文や構造が C 言語に非常によく似た言語です。アセンブリ言語ではなく HLSL を使ってシェーダーを記述できるので、開発者は既に精通している言語の機能および要素を利用できるだけでなく、D3DX シェーダー コンパイラの優れた最適化機能も利用できます。

Ee417786.HLSLwithoutEffects(ja-jp,VS.85).jpg

Path

ソース SDK ルート\Samples\C++\Direct3D\HLSLwithoutEffects
実行可能ファイル SDK ルート\Samples\C++\Direct3D\Bin\x86 または x64\HLSLwithoutEffects.exe

HLSLwithoutEffects が動作するしくみ

このサンプルでレンダリングするシーンは、XZ 平面にある複数の三角形の正方形グリッドで構成されています。各フレームでは、原点までの距離と時間の関数に基づいて、このグリッドの頂点が Y 方向に沿って上下に移動します。頂点はまた、距離と時間の別の関数を使用してライティングされます。時間はフレームごとに増分されます。頂点の Y 座標と色はフレームごとに生成されるため、格納する必要はありません。したがって、頂点の宣言には X および Z 座標の D3DXVECTOR2 のみを記述します。

初期化時に、サンプルは D3DXCompileShaderFromFile を呼び出し、ファイルからシェーダー関数を読み取ってバイナリ シェーダー コードにコンパイルします。このプロセスの後、シェーダー コードが含まれる ID3DXBuffer と、アプリケーションによるシェーダーのグローバル変数の取得および設定を可能にする ID3DXConstantTable が作成されます。次に、サンプルは、シェーダー コードを使用して IDirect3DDevice9::CreateVertexShader を呼び出し、デバイスに渡すことのできる IDirect3DDevice9 オブジェクトを取得します。

FrameMove の場合、サンプルはシェーダーのビュー + 射影トランスフォームと時間パラメーターを更新するために、ID3DXConstantTable インターフェイスを使用して、シェーダーのグローバル変数 mViewProj および fTime を設定します。レンダリング時、サンプルは IDirect3DDevice9::SetVertexShader を呼び出して、デバイスに対する頂点シェーダーのレンダリングを有効にします。この後で IDirect3DDevice9::DrawIndexedPrimitive を呼び出すと、頂点が処理されるたびに 1 回、頂点シェーダーが呼び出されます。

このサンプルの場合、頂点シェーダーは HLSLwithoutEffects.vsh というテキスト ファイルに記述されます。このファイルには、2 つのグローバル変数と、Ripple というシェーダー関数が含まれます。Ripple は、1 つの float2 を頂点の X および Z の入力として受け取り、スクリーン空間の位置と頂点色を表す 2 つの float4 を出力します。Y 座標は次の式で生成されます。

		Y = 0.1 * sin( 15 * L * sin(T) );

L は、Y を調整する前の頂点から原点までの距離です。頂点は XZ 平面にあるため、L の値は sqrt(X2 + Z2) になります。T は、fTime グローバル変数です。

頂点は、次の式に基づいて、ややグレーがかった色になります。

		C = 0.5 - 0.5 * cos( 15 * L * sin(T) );

C は、赤、緑、青、アルファのすべてに使用される 0 ~ 1 の値になり、頂点に黒から白までの色を付けます。結果は、後方と前方とで幅が狭くなったり広くなったりしながら、傾斜に応じて適切に陰影が付けられた波紋のようになります。

このサンプルで定義されている共通操作は、以下のとおりです。

キー アクション
W/S 前に移動/後ろに移動
Q、E、A、D 機銃掃射
F2 デバイスの変更
Esc Quit