Platform SDK: DirectX

ユーザー定義クリップ面とは

ユーザー定義クリップ面を使用すると、アプリケーションでは、任意のクリップ面を適用してシーンのジオメトリをクリッピングすることができる。クリップ面は一般平面式で定義される。システムではこの式をワールド空間のものと見なす。

次の図は、Spheremap サンプルを利用したもので、クリッピングのエフェクトを強調するために若干修正を加えている (サンプルは、ワイヤーフレームでレンダリングするように修正され、背面カリングは無効になっている)。この画像にはクリップ面は適用されていない。

ユーザー定義クリップ面を適用すると、シーンのジオメトリを簡単にクリッピングすることができる。以下の不等式が成り立つ場合、ワールド座標 (x, y, z) の点が面で区切られた半分の空間から切り取られる。

この公式では、A、B、C、および D は、面を定義するためにアプリケーションからシステムに提供される係数である。クリップ面上またはその後方にある点がシーンから切り取られる。次の画像は 2 つのティーポットを示す。2 つの異なる面で切り取られている。

左側のティーポットを切り取った面の係数は [A = -1.0, B = 0.0, C = 0.0, D = 0.0] であり、x >=0 を満たす頂点がすべて切り取られる。右側のティーポットを切り取ったた面は、係数 [A = 1.0, B = 0.0, C = 1.0, D = 0.0] で定義され、z >= 0.0 を満たす頂点がすべて切り取られる。

ジオメトリは、複数の面を使用してクリッピングすることができる。複数のクリップ面を使用する場合、各面によって定義される区切られた空間の組み合わせがレンダリング領域になる。次の画像は、2 つの面でクリッピングされたティーポットを示す。

このティーポットは 2 つの面で切り取られている。1 つは係数 [A = 1.0, B = 0.0, C = 0.0, D = 0.0] の面で、もう 1 つは係数 [A = 0.0, B = -1.0, C = 0.0, D = 0.0] で定義される面である。

[C++]

Direct3D では最大 32 個 (D3DMAXUSERCLIPPLANES) のクリップ面による切り取りが可能であるが、デバイスで最大いくつのクリップ面を使用できるかはまちまちである。この点を間違えないように、現在のデバイス (D3DDEVICEDESC7 構造体の wMaxUserClipPlanes メンバ) のデバイス機能を常にチェックするようにする。

[Visual Basic]

Direct3D では最大 32 個のクリップ面による切り取りが可能であるが、デバイスで最大いくつのクリップ面を使用できるかはまちまちである。この点を間違えないように、現在のデバイス (D3DDEVICEDESC7 型の nMaxUserClipPlanes メンバ) のデバイス機能を常にチェックするようにする。

ここに示す単純なジオメトリ クリッピングも多くの場合は有効な手段として使用されるが、ユーザー定義クリップ面はそれよりもさらに多くの用途を持つ。ユーザー定義クリップ面とステンシル バッファを組み合わせると、キャッピング、干渉テストなどの高度なタスクを実行できる。