Clip Volume サンプル

Clip Volume サンプル

説明

ClipVolume サンプルでは、レンダリングの際にシェーダを使って任意のモデルから球を "差し引く" 手法を示す。この手法は、ビジュアライゼーション アプリケーションで複雑なオブジェクトの内側を表示するときに役に立つ。このサンプルでは、両面ライティングの実行方法も示す。

パス

ソース ファイル : (SDK ルート)\Samples\C++\Direct3D\ClipVolume

実行可能ファイル : (SDK ルート)\Samples\C++\Direct3D\Bin

ユーザーズ ガイド

次の表は、実装されているキーを示している。メニュー コマンドを使って同じ操作を行うことができる。

キー 動作
Enter シーンを開始および停止する。
Space キー シーンを少しずつ進める。
F1 ヘルプまたは使用可能なコマンドを表示する。
F2 新しいレンダリング デバイスまたは新しいディスプレイ モードを選択するようユーザーに指示する。
Alt+Enter フルスクリーン モードとウィンドウ モードを切り替える。
Esc アプリケーションを終了する。

このサンプルでは、マウスを使って視点の位置を制御できる。

プログラミング上の注意

このサンプルでは、2 つの ID3DXMesh オブジェクトを作成する。1 つはティーポット用、もう 1 つは球用である。ティーポットをレンダリングする際には頂点シェーダとピクセル シェーダを使い、球のレンダリングには別の頂点シェーダを使う。

球の頂点シェーダは特殊な処理は行わない。頂点位置に対して標準的なワールドビュー射影トランスフォームを実行し、ディフューズ色を50% アルファで濃い青に設定するだけである。球はティーポットの内部を表示させるためだけの目的で使うことに注意してほしい。サンプルに示すクリッピング エフェクトを得るのに球のレンダリングは不要である。

ティーポットの頂点シェーダは次の 3 つのタスクを実行する。

  1. ワールドビュー射影行列による頂点位置の標準トランスフォーム。
  2. 球の中心 (c12 レジスタに格納されている) から各頂点までの距離を計算し、その距離を球の半径 (c12.w に格納されている) と比較して、その差を oT0 に格納する。同じ浮動小数点数値の、oT0 の 4 つ (xyzw) の部分すべてに入れる。ピクセル シェーダ命令 texkill は 4 つの成分すべてを読み取るため、4 つの成分すべてに書き込むこと。oT0 のデータは球の半径の内側では負になり、半径の外側では正になることに注意。
  3. ティーポットに両面ディフューズ ライティングを実行する。回転行列を使って頂点法線をトランスフォームし、頂点が前面にあれば r3.x を 1 に設定し、頂点が背面にあれば 0 を設定する。次に、mad 命令を使って r5 を c92 + (r3.x * c91) に設定する。つまり、 r3.x が 0 なら赤 (c92)、r3.x が 1 なら緑 (c91 + c92) になる。最後に、r5 にその頂点での光の強度 (r3.z の絶対値) を乗算する。

ティーポットのピクセル シェーダは、テクスチャ座標が 0 より小さい場合はピクセルをレンダリングしないように、texkill 命令を使う。球の内側では、すべての頂点およびピクセルの x テクスチャ座標は負になるので、球の内側にあるピクセルはレンダリングされない。

このサンプルは、Microsoft® DirectX® ソフトウェア開発キット (SDK) の他のサンプルと共有するサンプル フレームワーク コードを使用する。 サンプル フレームワークのヘッダーは (SDK ルート)\DXSDK\Samples\C++\Common\Include、ソース コードは (SDK ルート)\DXSDK\Samples\C++\Common\Src にある。