SimpleBezier11 サンプル

Ee416574.d3d11_sample_SimpleBezier11(ja-jp,VS.85).jpg

パス

ソース SDK ルート\Samples\C++\Direct3D11\SimpleBezier11
実行可能ファイル SDK ルート\Samples\C++\Direct3D11\Bin\x86 または x64\SimpleBezier11.exe

サンプルの概要

DirectX 11 では、新たに 3 つのステージがグラフィックス パイプラインに追加されました。ハル シェーダー ステージ、固定機能テッセレータ ステージ、およびドメイン シェーダー ステージです。これらのステージは、頂点シェーダーとジオメトリ シェーダー間で連携して機能し、ベジエ パッチや小分割サーフェスなどのさまざまなサーフェス表現を実装するための柔軟性を提供します。このサンプルでは、単純な 3 次ベジエ パッチをレンダリングするための、DirectX 11 テッセレーション機能の基本的な使用方法を示します。

Ee416574.d3d11_pipeline_stages_tessellation(ja-jp,VS.85).gif

セットアップ

テッセレータの使用に際して必要となる最初の、そして最も大きな変更は、入力メッシュ データの変更です。三角形を使用する代わりに、任意のサーフェス表現をメッシュ データに使用できるようになりました。このサンプルでは、それぞれに 16 個のコントロール ポイントがある 4 つの 3 次ベジエ パッチを使用します。その後、ハル シェーダーとドメイン シェーダーを設定し、新しい D3D11_PRIMITIVE_TOPOLOGY タイプを使用して、DirectX に入力トポロジを指定する必要があります。

pd3dImmediateContext->HSSetShader( pHullShader, NULL, 0 );pd3dImmediateContext->DSSetShader( pDomainShader, NULL, 0 );pd3dImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_16_CONTROL_POINT_PATCHLIST );

頂点シェーダー

パイプラインの最初のステップは、頂点シェーダーです。ドメイン シェーダーで処理する前に頂点シェーダーでメッシュの入力コントロール ポイントが処理される点を除けば、以前とほとんど変わりません。たとえば、頂点シェーダーでコントロール ポイント スキニングが実行される場合があります。頂点シェーダーへの入力は、頂点バッファーから渡されます。そして、頂点シェーダーからの出力は、ハル シェーダーに渡されます。

ハル シェーダー

ハル シェーダーは、DirectX 11 で新たに追加された最初のステージです。ハル シェーダー処理には 2 つのフェーズがあります。1 つ目は、outputcontrolpoints 属性によって制御される出力ごとのコントロール ポイントの処理です。入力は、頂点シェーダーの変換されたコントロール ポイントから渡されます。出力コントロール ポイントは、ドメイン シェーダーで引き続き処理されます。単純なベジエ パッチの場合、余分な処理は不要なため、コントロール ポイントは評価のためにそのままドメイン シェーダーに渡されます。より複雑なサーフェスの場合、ハル シェーダーで基底変換や、隣接性情報からのコントロール ポイントの生成が実行される場合があります。入力コントロール ポイントの数と出力コントロール ポイントの数は、必ずしも同じである必要はありませんが、このサンプルでは同じです。

ハル シェーダーの 2 つ目のフェーズは、定数関数の処理です。この関数は各パッチで 1 回呼び出され、patchconstantfunc 属性によって指定されます。最も単純な定数関数では、固定機能テッセレータ ステージで使用されるテッセレーション係数の SV_TessFactor および SV_InsideTessFactor が出力されます。

Ee416574.d3d11_hull_shader(ja-jp,VS.85).gif

固定機能テッセレータ

パイプラインの次のステージは、固定機能テッセレータです。ここでは、入力ドメインがテッセレーション係数の値で必要となる多数のプリミティブに小分割されます。このステージで、コントロール ポイントが処理されることはありません。ドメイン シェーダーに渡す出力プリミティブと UVW 座標の生成のみが行われます。入力は、SV_TessFactor および SV_InsideTessFactor からのテッセレーション係数と、partitioning および domain 属性からのパーティション モード ドメインで構成されます。この入力から、SV_DomainLocation 正規化 UVW 座標がドメイン シェーダーに出力されます。

ドメイン シェーダー

ドメイン シェーダーは、DirectX 11 で追加されたテッセレーション パイプラインの最後のステージです。固定機能テッセレータによって作成された出力頂点が処理されます。ドメイン シェーダーは、コントロール ポイントから最終的な頂点の位置および属性を計算する役割を担います。ここで、ベジエ サーフェスが評価され、位置が計算されます。

Ee416574.d3d11_domain_shader(ja-jp,VS.85).gif

入力コントロール ポイントはハル シェーダーから渡され、入力 UVW 座標は固定機能テッセレータから渡されます。この情報を使用して、次のように 3 次ベジエ曲線関数の行列形式で、ベジエ サーフェスを U および V 方向で評価できます。

Ee416574.d3d11_sample_SimpleBezier11_EQ(ja-jp,VS.85).gif

最終的に、サーフェス法線を U 微分および V 微分の外積として評価できます。

ジオメトリ シェーダー

ジオメトリ シェーダーはこのサンプルでは示していませんが、使用時には、ドメイン シェーダー後の処理となり、ドメイン シェーダーの出力を入力として受け取ります。