Microsoft DirectX 8.0 (C++) |
ShadowVolume サンプルでは、ステンシル バッファを使って、リアルタイムの影を実現している。このサンプルでは、複雑なオブジェクトがレンダリングされて、影をキャストするオブジェクトとして使用され、そのオブジェクト自体およびその下の地形にリアルタイムの影をキャストしている。
ステンシル バッファは、ジオメトリをレンダリングするときに更新できる深度バッファの手法で、ほかのジオメトリを描画するためのマスクとして再度使用できる。一般的なエフェクトには、鏡、(高度な手法としての) 影、ディゾルブなどがある。
ステンシル バッファ手法の一部の機能しかサポートしていないカードもある。一部のハードウェアでは、ステンシルバッファをサポートしていない場合や、一部しかサポートしていない場合がある。ステンシル バッファの詳細については、Microsoft® DirectX® SDK のマニュアルを参照すること。
ソース :(SDK ルート)\Samples\Multimedia\Direct3D\StencilBuffer\ShadowVolume
実行可能ファイル :(SDK ルート)\Samples\Multimedia\Direct3D\Bin
次の表は実装されているキーを示している。メニュー コマンドを使って同じ操作を行うことができる。
キー | アクション |
---|---|
Enter | シーンを開始および停止する。 |
Space | シーンを少しずつ進める。 |
F2 | 新しいレンダリング デバイスまたはディスプレイ モードを選択するようユーザーに指示する。 |
Alt + Enter | フルスクリーン モードとウィンドウ モードを切り替える。 |
Esc | アプリケーションを終了する。 |
リアルタイムの影の作成はかなり高度な手法である。各フレームで、つまりシーン内のジオメトリまたはライトが移動するときに、シャドウ ボリュームと呼ばれるオブジェクトが計算される。シャドウ ボリュームは、光源から押し出されたときの、影をキャストするオブジェクトのシルエットである 3D オブジェクトである。
このサンプルでは、影をキャストする 3D オブジェクトは複葉機である。飛行機のシルエットは各フレームで計算される。この手法では、エッジ検出アルゴリズムを使用して、シルエットのエッジを検出する。隣接するポリゴンの法線には光のベクトルに関して、反対方向に伸びる法線があるため、このようなエッジ検出が可能である。検出されたエッジ リスト (シルエット) は、光源から離れるように押し出されて 3D オブジェクトになる。この 3D オブジェクトは、このボリュームの内側にあるすべてのポイントが影の中にあるので、シャドウ ボリュームと呼ばれる。
次に、シャドウ ボリュームは、ステンシル バッファに 2 回レンダリングされる。最初は前向きのポリゴンだけがレンダリングされ、ステンシル バッファ値が毎回インクリメントされる。次に、シャドウ ボリュームの後ろ向きのポリゴンが描画され、ステンシル バッファの値がデクリメントされる。通常、インクリメントされた値とデクリメントされた値はすべて互いに打ち消し合う。しかし、シーンは既に法線ジオメトリ (この場合は平面と地形) を使ってレンダリングされているので、一部のピクセルはシャドウ ボリュームをレンダリングするときに Z バッファ テストに合格しない。ステンシル バッファに残った値が、影の中のピクセルに対応する。
最後に、すべてを含む大きな四角形をシーンにアルファ ブレンディングするときに、この残ったステンシル バッファの内容がマスクとして使用される。ステンシル バッファをマスクとして使用することによって、影の中のピクセルだけが暗くなる。
このサンプルでは、ヘルパー関数などのプログラミング要素から構成される共通の Microsoft DirectX® コードを使用している。このコードは DirectX SDK のほかのサンプルと共有されている。共通のヘッダーおよびソース コードは、(SDK ルート)\Samples\Multimedia\Common にある。