ラスタライザー ステージを使用したはじめに
このセクションでは、ビューポート、ハサミの四角形、ラスタライザーの状態、マルチサンプリングの設定について説明します。
ビューポートを設定する
ビューポートは、頂点の位置 (クリップ空間内) をレンダー ターゲットの位置にマップします。 このステップでは、3D 位置を 2D 空間にスケーリングします。 レンダー ターゲットの方向は、Y 軸が下向きになります。これには、ビューポートのスケール中に Y 座標が反転する必要があります。 さらに、次の数式に従って、x と y の範囲 (x と y の値の範囲) がビューポートのサイズに合わせてスケーリングされます。
X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth)
チュートリアル 1 では、D3D11_VIEWPORT を使用し、ID3D11DeviceContext::RSSetViewports を呼び出して、640 × 480 ビューポートを作成します。
D3D11_VIEWPORT vp[1];
vp[0].Width = 640.0f;
vp[0].Height = 480.0f;
vp[0].MinDepth = 0;
vp[0].MaxDepth = 1;
vp[0].TopLeftX = 0;
vp[0].TopLeftY = 0;
g_pd3dContext->RSSetViewports( 1, vp );
ビューポートの説明では、ビューポートのサイズ、深度をマップする範囲 ( MinDepth と MaxDepth を使用)、およびビューポートの左上の配置を指定します。 MinDepth は MaxDepth 以下である必要があります。 MinDepth と MaxDepth の両方の範囲は、0.0 から 1.0 の範囲です。 ビューポートがレンダー ターゲットにマップされるのが一般的ですが、必要ありません。さらに、ビューポートのサイズや位置がレンダー ターゲットと同じである必要はありません。
ビューポートの配列を作成できますが、ジオメトリ シェーダーからのプリミティブ出力に適用できるのは 1 つだけです。 アクティブに設定できるビューポートは一度に 1 つだけです。 パイプラインでは、ラスター化中に既定のビューポート (および次のセクションで説明するハサミの四角形) が使用されます。 既定値は、常に配列内の最初のビューポート (またはハサミの四角形) です。 ジオメトリ シェーダーでビューポートのプリミティブごとの選択を実行するには、GS 出力シグネチャ宣言の適切な GS 出力コンポーネントで ViewportArrayIndex セマンティックを指定します。
ラスタライザー ステージに一度にバインドできるビューポート (およびハサミの四角形) の最大数は 16 です ( D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINEで指定)。
ハサミの四角形を設定する
ハサミの四角形を使用すると、出力マージャー ステージに送信されるピクセル数を減らすためのもう 1 つの機会が得られます。 ハサミの四角形の外側のピクセルは破棄されます。 ハサミの四角形のサイズは整数で指定します。 ラスター化中に三角形に適用できるのは、1 つのシザー四角形 (システム値セマンティクスの ViewportArrayIndex に基づく) のみです。
ハサミの四角形を有効にするには、(D3D11_RASTERIZER_DESC1の) ScissorEnable メンバーを使用します。 既定のハサミの四角形は空の四角形です。つまり、すべての修正値は 0 です。 つまり、ハサミの四角形を設定せず、ハサミが有効になっている場合は、出力合併ステージにピクセルを送信しません。 最も一般的な設定は、ビューポートのサイズに合わせ、ハサミの四角形を初期化することです。
ハサミの四角形の配列をデバイスに設定するには、 ID3D11DeviceContext::RSSetScissorRects を D3D11_RECTで呼び出します。
D3D11_RECT rects[1];
rects[0].left = 0;
rects[0].right = 640;
rects[0].top = 0;
rects[0].bottom = 480;
g_pd3dContext->RSSetScissorRects( 1, rects );
このメソッドは、(1) 配列内の四角形の数と (2) 四角形の配列の 2 つのパラメーターを受け取ります。
パイプラインでは、ラスター化中に既定のハサミ四角形インデックスが使用されます (既定では、クリッピングが無効になっている 0 サイズの四角形です)。 これをオーバーライドするには、GS 出力シグネチャ宣言で GS 出力コンポーネントにSV_ViewportArrayIndexセマンティックを指定します。 これにより、GS ステージは、このセマンティックを使用して、この GS 出力コンポーネントをシステム生成コンポーネントとしてマークします。 ラスタライザー ステージはこのセマンティックを認識し、ハサミの四角形の配列にアクセスするために、それがアタッチされているパラメーターをハサミの四角形のインデックスとして使用します。 ラスタライザー オブジェクトを作成する前に、ラスタライザーの説明で [ScissorEnable ] 値を有効にして、定義したハサミの四角形を使用するようにラスタライザー ステージに指示してください。
ラスタライザーの状態を設定する
Direct3D 10 以降では、ラスタライザーの状態はラスタライザー状態オブジェクトにカプセル化されます。 最大 4096 個のラスタライザー状態オブジェクトを作成し、状態オブジェクトにハンドルを渡すことでデバイスに設定できます。
ラスタライザーの説明からラスタライザー状態オブジェクトを作成するには、 ID3D11Device1::CreateRasterizerState1 を使用します ( 「D3D11_RASTERIZER_DESC1」を参照)。
ID3D11RasterizerState1 * g_pRasterState;
D3D11_RASTERIZER_DESC1 rasterizerState;
rasterizerState.FillMode = D3D11_FILL_SOLID;
rasterizerState.CullMode = D3D11_CULL_FRONT;
rasterizerState.FrontCounterClockwise = true;
rasterizerState.DepthBias = false;
rasterizerState.DepthBiasClamp = 0;
rasterizerState.SlopeScaledDepthBias = 0;
rasterizerState.DepthClipEnable = true;
rasterizerState.ScissorEnable = true;
rasterizerState.MultisampleEnable = false;
rasterizerState.AntialiasedLineEnable = false;
rasterizerState.ForcedSampleCount = 0;
g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );
この一連の状態の例では、おそらく最も基本的なラスタライザーのセットアップが実現されます。
- 塗りつぶしモード (単色)
- 背面をカリングアウトまたは削除します。プリミティブの反時計回りの巻き上げ順序を想定する
- 深度バイアスをオフにしますが、深度バッファリングを有効にして、ハサミの四角形を有効にします
- マルチサンプリングとラインアンチエイリアシングをオフにする
さらに、基本的なラスタライザー操作には、常にクリッピング (視錐台へのクリッピング)、パースペクティブ除算、ビューポート スケールが含まれます。 ラスタライザー状態オブジェクトが正常に作成されたら、次のようにデバイスに設定します。
g_pd3dContext->RSSetState(g_pRasterState);
マルチサンプリング
マルチサンプリングでは、イメージの一部またはすべてのコンポーネントが高解像度でサンプリングされ (その後、元の解像度にダウンサンプリングされます)、ポリゴン エッジの描画によって引き起こされる最も目に見えるエイリアシングの形式を減らすことができます。 マルチサンプリングにはサブピクセル サンプルが必要ですが、最新の GPU では、ピクセル シェーダーがピクセルごとに 1 回実行されるようにマルチサンプリングが実装されています。 これにより、パフォーマンス (特に GPU バインド アプリケーションの場合) と最終的なイメージのアンチエイリアシングとの間に許容されるトレードオフが提供されます。
マルチサンプリングを使用するには、ラスター化の説明で enable フィールドを設定し、マルチサンプリングされたレンダー ターゲットを作成し、シェーダーでレンダー ターゲットを読み取ってサンプルを 1 ピクセルの色に解決するか、ID3D11DeviceContext::ResolveSubresource を呼び出してビデオ カードを使用してサンプルを解決します。 最も一般的なシナリオは、1 つ以上のマルチサンプリングされたレンダー ターゲットに描画することです。
マルチサンプリングは、サンプル マスクを使用するか、 アルファ対カバレッジ を有効にするか、ステンシル操作 (常にサンプルごとに実行されます) に依存しません。
深度テストは、マルチサンプリングの影響を受ける:
- マルチサンプリングを有効にすると、サンプルごとに深度が補間され、サンプルごとに深度/ステンシル テストが行われます。ピクセル シェーダーの出力色は、すべての合格サンプルに対して複製されます。 ピクセル シェーダーが深度を出力すると、すべてのサンプルに対して深度値が複製されます (ただし、このシナリオではマルチサンプリングの利点が失われます)。
- マルチサンプリングを無効にすると、深度/ステンシル テストはサンプルごとに実行されますが、深度はサンプルごとに補間されません。
1 つのレンダー ターゲット内でマルチサンプリングレンダリングと非マルチサンプリング レンダリングを混在しても制限はありません。 マルチサンプリングを有効にし、マルチサンプリングされていないレンダー ターゲットに描画すると、マルチサンプリングが有効になっていない場合と同じ結果が生成されます。サンプリングは、1 ピクセルあたり 1 つのサンプルで行われます。
関連トピック