カリング



概要

カリングとは描画する必要がないポリゴンを描画しないようにする手法です。
この方法によって描画するポリゴン数が減少するので、高速化の手法としてよく使用されています。

ポリゴンの裏表

ポリゴンには表と裏が存在します。
このポリゴンの表と裏の判断は頂点の並びが「時計回り」か「反時計回り」かで判断します。
どちらを表とするかは設定で変更することが可能です。
DirectX(左手系)は「時計回りを表」、OpenGL(右手系)は「反時計回りを表」となっています。
gmpg_0096

法線ベクトル

ポリゴンが表か裏かは法線ベクトルが向いている方向になります。
法線ベクトルは頂点の順番に従った2つのベクトルを利用して外積計算を行います。
その結果として算出されたベクトルが法線ベクトルです。
gmpg_0099

背面カリング

背面カリングはカリングの中で最も一般的とされているカリング方法です。
このカリングはカメラに対してポリゴンの表と裏を判断して描画の有無を判断します。
カメラや光に対してポリゴンが表を向いているかどうかの判断は
ポリゴンの向きベクトルとカメラや光の向きベクトルによって算出できます。
	
gmpg_0097

内積の角度が鈍角ならば描画、鋭角ならば非描画と判断します。

DirectX9

DirectX9ではSetRenderStateを使用することで簡単に実行できます。

SetRenderState(D3DRS_CULLMODE, カリングモード);

カリングモード

DirectXのカリングモードの設定は以下の種類があります。
カリングモードの種類
種類 効果
D3DCULL_NONE カリングなし
D3DCULL_CW 時計回りを裏面とする
D3DCULL_CCW 反時計回りを裏面とする
DirectXは左手系なので基本的にはD3DCULL_CCWが使用されています。

背面カリングの効果

以下の動画で、二つのテクスチャを回転させています。
上のテクスチャが背面カリングを適用、下のテクスチャが非適用です。





回転中のテクスチャでカリングを適用しているテクスチャは途中で消えています。
これがポリゴンの裏面描画によって、カリングが行われているということです。
非適用のテクスチャではカリングが行われていないので裏面も描画されます。
※裏面描画の場合は反転して描画されます。

視錐台カリング

視錐台カリングとはオブジェクトがカメラの視錐台の中に
あるかどうかで描画の有無を判断します。
DirectXではサポートされていないため実装するには各オブジェクトに
バウンディングスフィア(当たり判定用球)を作成し、
視錐台とバウンディングスフィアで当たり判定を行い、
当たっていれば描画、当たっていなければ非描画とします。

gmpg_0098

オクルージョンカリング

オクルージョンカリングとは不透明オブジェクトによって別オブジェクトが
隠される場合に、隠される側のオブジェクトを描画しないというものです。
この時の遮蔽物となるオブジェクトのことをオクルーダーと呼びます。

gmpg_0093