次の方法で共有


機能レベル 9 ハードウェア上のユーザー クリップ プレーン

Windows 8 以降、Microsoft High Level Shader Language (HLSL) では、Microsoft Direct3D 11 API で使用して、機能レベル 9_x 以上のユーザー クリップ プレーンを指定できる構文がサポートされています。 このクリッププレーン構文を使用してシェーダーを記述し、Direct3D 11 API でそのシェーダー オブジェクトを使用して、すべての Direct3D 機能レベルで実行できます。

バックグラウンド

IDirect3DDevice9::SetClipPlane および IDirect3DDevice9::GetClipPlaneメソッドをして、Microsoft Direct3D 9 API のユーザー クリップ プレーンにアクセスできます。 Microsoft Direct3D 10 以降では、SV_ClipDistance セマンティックを介してユーザー クリップ プレーンにアクセスできます。 ただし、Windows 8 より前のSV_ClipDistanceは、Direct3D 10 または Direct3D 11 API のハードウェア 9_x 機能レベルでは使用できませんでした。 そのため、Windows 8 より前のバージョンでは、機能レベル9_xハードウェアでユーザー クリップ プレーンにアクセスする唯一の方法は、Direct3D 9 API を使用することでした。 Direct3D Windows ストア アプリでは、Direct3D 9 API を使用できません。 ここでは、機能レベル 9_x 以上の Direct3D 11 API を介してユーザー クリップ プレーンにアクセスするために使用できる構文について説明します。

アプリでは、クリッププレーンを使用して、描画されたすべてのプリミティブをクリップ (捨てる) 3D ワールド内の非表示平面のセットを定義します。 Windows では、クリッププレーンの負の側にあるピクセルは描画されません。 その後、アプリはクリッププレーンを使用して平面反射をレンダリングできます。

構文

関数宣言でクリップ プレーンを関数属性として宣言するには、次の構文を使用します。 たとえば、ここでは頂点シェーダー フラグメントの構文を使用します。

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

頂点シェーダー フラグメントのこの例は、2 つのクリッププレーンを表します。 頂点シェーダーの戻り値の直前に、新しい クリッププレーン 属性を角かっこ内に配置する必要があることを示しています。 クリッププレーン 属性の後のかっこ内に、アクティブな各クリッププレーンの平面係数を定義する最大 6 float4 定数のリストを指定します。 この例では、各平面の係数を定数バッファーに配置する必要があることも示しています。

手記

クリップ プレーンを動的に無効にする構文はありません。 それ以外の場合は、クリッププレーン 属性を持たない同一のシェーダーを再コンパイルするか、アプリで定数バッファー内の係数をゼロに設定して、平面がジオメトリに影響しないようにする必要があります。

 

この構文は、vs_4_0_level_9_1とvs_4_0_level_9_3を含む任意の 4.0 以降の頂点シェーダー ターゲットで使用できます。

フィーチャ レベル 9 以降のクリップ空間にクリッププレーンを作成する

ここでは、フィーチャ レベル 9_x 以上のクリップ空間にクリッププレーン 作成する方法を示します。

バックグラウンド読み取り

Frank D. Luna の「DirectX 10 を使用した 3D ゲーム プログラミングの概要」では、必要なグラフィックス計算の背景 (第 1 章、2 章、3 章) と、頂点シェーダー (セクション 5.6 および 5.8) で発生するさまざまな空間と空間変換について説明します。

10Level9 機能レベル

Direct3D 10 以降では、理にかなっている任意の空間 (多くの場合、ワールド空間またはビュー空間) でクリップできます。 ただし、Direct3D 9 ではクリップ空間が使用されます。これは、事前パースペクティブ分割投影空間です。 ベクターは、頂点シェーダーが、グラフィックス パイプラインに続くステージにベクターを渡すときにクリップ空間にあります。

Windows ストア アプリを作成するときは、10Level9 機能レベル (機能レベル 9_x) を使用して、アプリを機能レベル 9_x 以降のハードウェアで実行できるようにする必要があります。 アプリは9_x以上の機能レベルをサポートしているため、クリップ空間にクリップ プレーンを適用する一般的な機能も使用する必要があります。

vs_4_0_level_9_1以降で頂点シェーダーをコンパイルする場合、その頂点シェーダーは クリッププレーン 属性を使用できます。 Direct3D 10 以降のオブジェクトには、出力された頂点のドット積が含まれています。この頂点には、属性で指定された float4 グローバル定数が含まれています。 Direct3D 9 オブジェクトには、10Level9 ランタイムが IDirect3DDevice9::SetClipPlane への適切な呼び出しを発行するのに十分なメタデータがあります。

クリップ 平面の数式

クリップ平面は、4 つのコンポーネントを持つベクトルによって定義されます。 最初の 3 つのコンポーネントは、クリップする空間内の原点から発生する x、y、z ベクトルを定義します。 このベクトルは、ベクトルに垂直な平面を意味し、原点を通過します。 Windows では、平面のベクター側にすべてのピクセルが保持され、平面の背後にあるすべてのピクセルがクリップされます。 4 番目の w コンポーネントは平面を押し戻し、ベクトル線に沿って Windows のクリップを少なくします (負の w の場合、Windows はクリップを増やします)。 x、y、z 成分が単位 (正規化された) ベクトルを構成する場合、w は平面 w 単位を押し戻します。

グラフィックス処理装置 (GPU) がクリッピングを決定するために実行する数学は、頂点ベクトル (x、y、z、1) とクリッピング平面ベクトルの間の単純なドット積です。 この算術演算では、クリップ 平面ベクトルに投影長が作成されます。 負のドット積は、平面のクリップ側にある頂点を示します。

ビュー空間でのクリッピング

ビュー空間の頂点を次に示します。

ビュー空間する

ビュー空間のクリップ プレーンを次に示します。

ビュー空間する

ビュー空間内の頂点とクリッププレーンのドット積を次に示します。

ClipDistance = v ·C = vCₓ +vyCy + vzCz + Cw

この算術演算は Direct3D 10 以降のオブジェクトに対して機能しますが、Direct3D 9 オブジェクトでは機能しません。 Direct3D 9 では、まずプロジェクション変換をクリップ空間に変換する必要があります。

射影行列

プロジェクション 行列は、頂点をビュー空間 (原点がビューアーの目、+x が右、+y が上、+z がまっすぐ前方) からクリップ空間に変換します。 プロジェクション マトリックスは、ハードウェアクリッピングの頂点と ラスタライズステージを読み取ります。 標準のパースペクティブ マトリックスを次に示します (他のプロジェクションには異なる数学が必要です)。

*r* ウィンドウの幅/高さの比率 *α* 表示角度 *f* ビューアーから遠い平面までの距離 *n* ビューアーから近くの平面までの距離
![プロジェクション マトリックス](画像/projection-matrix.png)

次のマトリックスは、前のマトリックスの簡略化されたバージョンです。 行列の乗算演算で後で使用できるように、行列を簡略化して示します。

簡略化された射影行列する

次に、ビュー空間の頂点を、マトリックス乗算を使用してクリップ空間に変換します。

行列乗算

行列乗算演算では、x 成分と y 成分はわずかに調整されますが、z 成分と w 成分は非常に混ざっています。 私たちのクリッププレーンは、私たちがこれ以上望むものを私たちに与えません。

クリップスペースクリッププレーン

ここでは、クリップスペースの頂点を持つドット積が v ·[ビュー空間の クリッピング] セクションの C

クリップ プレーンする

v ·C = v P ·CP

vCₓ +vyCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzyCPz + BCPz + vzCPw

これで、上記の算術演算を頂点コンポーネントごとに 4 つの独立した数式に分割できます。

クリップ プレーン積する

クリップ プレーン製品の y 頂点コンポーネントを

クリップ プレーン製品の頂点コンポーネントを

クリップ プレーン積する

ビュースペースクリッププレーンとプロジェクションマトリックスは、クリップスペースクリッププレーンを派生させ、提供します。

クリップスペースクリッププレーンする

HLSL プログラミング ガイド

関数宣言構文