ラスター化ルールRasterization rules

ラスター化ルールは、ベクトル データをラスター データにマップする方法を定義します。Rasterization rules define how vector data is mapped into raster data. ラスター データは、整数値の位置に配置されてからカリングおよびクリッピングされ (描画するピクセルの数を最小限にするため)、ピクセル単位の属性が (頂点単位の属性から) 補間された後、ピクセル シェーダーに渡されます。The raster data is snapped to integer locations that are then culled and clipped (to draw the minimum number of pixels), and per-pixel attributes are interpolated (from per-vertex attributes) before being passed to a pixel shader.

マップするプリミティブ タイプや、エイリアスを減らすためにデータでマルチサンプリングが使用されているかどうかに応じて、さまざまな種類のルールがあります。There are several types of rules, which depend on the type of primitive that is being mapped, as well as whether or not the data uses multisampling to reduce aliasing. 次の図は、コーナーの処理方法を示したものです。The following illustrations demonstrate how the corner cases are handled.

三角形ラスタライズ規則 (マルチサンプリングなし)Triangle Rasterization Rules (Without Multisampling)

三角形の内部にあるピクセルの中心はすべて描画されます。左上ルールに適合すると、ピクセルは内部にあると見なされます。Any pixel center which falls inside a triangle is drawn; a pixel is assumed to be inside if it passes the top-left rule. 左上ルールでは、ピクセルの中心が三角形の上のエッジまたは左のエッジにある場合に、三角形の内部にあると定義されます。The top-left rule is that a pixel center is defined to lie inside of a triangle if it lies on the top edge or the left edge of a triangle.

ここで、where:

  • 上のエッジは、完全に水平で、他のエッジよりも上にあるものです。A top edge, is an edge that is exactly horizontal and is above the other edges.
  • 左のエッジは、完全には水平でなく、三角形の左側にあるものです。三角形には、左のエッジが 1 つまたは 2 つあります。A left edge, is an edge that is not exactly horizontal and is on the left side of the triangle A triangle can have one or two left edges.

左上ルールによって、隣接する三角形が一度に描画されます。The top-left rule ensures that adjacent triangles are drawn once.

三角形の内側にある、または左上ルールに適合しているために描画されるピクセルの例を次の図に示します。This illustration shows examples of pixels that are drawn because they either lie inside a triangle or follow the top-left rule.

左上ルールに適合する三角形のラスター化の例

薄い灰色と濃い灰色はピクセルのグループです。ピクセルがどの三角形の内部にあるのかを示しています。The light and dark gray covering of the pixels show them as groups of the pixels to indicate which triangle they are inside.

線のラスター化ルール (エイリアス、マルチサンプリングなし)Line Rasterization Rules (Aliased, Without Multisampling)

線のラスター化ルールでは、ひし形テスト領域を使用して、線がピクセルをカバーするかどうかを決定します。Line rasterization rules use a diamond test area to determine if a line covers a pixel. x メジャー ライン (-1 <= 勾配<= +1 の線) の場合、ひし形テスト領域には、左下のエッジ、右下のエッジ、および下隅 (実線で表示) が含まれます。左上のエッジ、右上のエッジ、上隅、左隅、および右隅 (破線で表示) は除外されます。For x-major lines (lines with -1 <= slope <= +1), the diamond test area includes (shown solid) the lower-left edge, lower-right edge, and bottom corner; the diamond excludes (shown dotted) the upper-left edge, upper-right edge, the top corder, the left corner, and the right corner. y メジャー ラインは、x メジャー ライン以外の線です。ひし形テスト領域は x メジャー ラインについて説明したとおりですが、右隅も含まれる点が異なります。A y-major line is any line that is not an x-major line; the test diamond area is the same as described for the x-major line except the right corner is also included.

ひし形領域で、線を始点から終点に沿って移動したときに、その線がピクセルのひし形テスト領域を抜けている場合、線はピクセルをカバーします。Given the diamond area, a line covers a pixel if the line exits the pixel's diamond test area when traveling along the line from the start towards the end. ライン ストリップは、一連の線として描画されるので、同様に動作します。A line strip behaves the same, as it is drawn as a sequence of lines.

次の図に、いくつかの例を示します。The following illustration shows some examples.

エイリアスが適用された線のラスター化の例

線ラスタライズ規則 (マルチサンプリング、マルチサンプリングなし)Line Rasterization Rules (Antialiased, Without Multisampling)

アンチエイリアスが適用された線は、矩形 (幅 = 1) のようにラスター化されます。An antialiased line is rasterized as if it were a rectangle (with width = 1). 矩形は、ピクセル シェーダー出力のアルファ成分に乗算されるピクセル単位のカバレッジ値を生成するレンダー ターゲットと交差します。The rectangle intersects with a render target producing per-pixel coverage values, which are multiplied into pixel shader output alpha components. マルチサンプリング レンダー ターゲットに線を描画する場合、アンチエイリアシングは実行されません。There is no antialiasing preformed when drawing lines on a multisampled render target.

アンチエイリアスが適用された線のレンダリングを実行する "最善" の方法は 1 つではないと考えられます。It is deemed that there is no single "best" way to perform antialiased line rendering. Direct3D では、下の図に示されている方法をガイドラインとして採用します。Direct3D adopts as a guideline the method shown in the following illustration. この方法は経験から導かれたもので、望ましいと思われるいくつかのビジュアル プロパティがあります。This method was derived empirically, exhibiting a number of visual properties deemed desirable.

ハードウェアがこのアルゴリズムに完全に一致する必要はありません。このリファレンスに対するテストには、下の方に記載されているいくつかの原則に従った "妥当" な許容範囲があり、さまざまなハードウェア実装やフィルター カーネル サイズが許容されます。Hardware need not exactly match this algorithm; tests against this reference shall have "reasonable" tolerances, guided by some of the principles listed further below, permitting various hardware implementations and filter kernel sizes. ただし、ハードウェアの実装で許容されるこの柔軟性は、単なる線の描画や外観の確認/評価を超えるものであり、Direct3D を通じてアプリケーションに伝達することはできません。None of this flexibility permitted in hardware implementation, however, can be communicated up through Direct3D to applications, beyond simply drawing lines and observing/measuring how they look.

アンチエイリアスが適用された線のラスター化の例

このアルゴリズムでは、インテンシティが均一で、エッジのギザギザやブレーディングが最小限に抑えられた、比較的滑らかな線が生成されます。This algorithm generates relatively smooth lines, with uniform intensity, with minimal jagged edges or braiding. 接近した線のモアレ パターンは最小限に抑えられます。Moire patterning for close lines is minimized. 端と端が接している線分間の区切りも適切にカバーされます。There is good coverage for junctions between line segments placed end-to-end.

フィルター カーネルは、エッジのぼかしの量とガンマ修正によって生じる強度の変化との適正なトレードオフです。The filter kernel is a reasonable tradeoff between the amount of edge blurring and the changes in intensity caused by gamma corrections. カバレッジ値は、出力結合 (OM) ステージで次の式によってピクセル シェーダーの o0.a (srcAlpha) に乗算されます。The coverage value is multiplied into pixel shader o0.a (srcAlpha) per the following formula by the Output Merger (OM) stage:

srcColor * srcAlpha + destcolor * (1-srcAlpha)srcColor * srcAlpha + destColor * (1-srcAlpha)

ポイントラスタライズ規則 (マルチサンプリングなし)Point Rasterization Rules (Without Multisampling)

点は、三角形のラスター化ルールを使用する Z パターンの 2 つの三角形で構成されているものとして解釈されます。A point is interpreted as though it were composed of two triangles in a Z pattern, which use triangle rasterization rules. 座標は、1 つのピクセル幅の正方形の中心を示します。The coordinate identifies the center of a one pixel wide square. 点のカリングはありません。There is no culling for points.

次の図に、いくつかの例を示します。The following illustration shows some examples.

点のラスター化の例

マルチサンプリングアンチエイリアシングラスタライズルールMultisample Anti-Aliasing Rasterization Rules

マルチサンプル アンチエイリアシング (MSAA) は、複数のサブサンプリング位置でピクセルのカバレッジおよび深度/ステンシル テストを使用してジオメトリのエイリアスを低減します。Multisample antialiasing (MSAA) reduces geometry aliasing using pixel coverage and depth-stencil tests at multiple sub-sample locations. パフォーマンスを向上させるために、カバーされたサブピクセル間でシェーダー出力を共有することで、カバーされたピクセルごとに 1 回ずつピクセル単位の計算が実行されます。To improve performance, per-pixel calculations are performed once for each covered pixel, by sharing shader outputs across covered sub-pixels. マルチサンプル アンチエイリアシングでは、サーフェスのエイリアスは低減されません。Multisample antialiasing does not reduce surface aliasing. サンプリング位置や再構築関数は、ハードウェアの実装によって異なります。Sample locations and reconstruction functions are dependent on the hardware implementation.

次の図に、いくつかの例を示します。The following illustration shows some examples.

マルチサンプル アンチエイリアスのラスター化の例

サンプリング位置の数は、マルチサンプル モードによって異なります。The number of sample locations is dependent on the multisample mode. 頂点属性は、ピクセルの中心で補間されます。この場所で、ピクセル シェーダーが呼び出されるためです (中心がカバーされていない場合は補外になります)。Vertex attributes are interpolated at pixel centers, since this is where the pixel shader is invoked (this becomes extrapolation if the center is not covered). 重心でサンプリングされるように、ピクセル シェーダー内で属性にフラグを設定できます。これにより、カバーされていないピクセルで、ピクセルの領域とプリミティブの交点で属性が補間されます。Attributes can be flagged in the pixel shader to be centroid sampled, which causes non-covered pixels to interpolate the attribute at intersection of the pixel's area and the primitive.

(x と y のデルタを使用する) 微分計算をサポートするために、2x2 のピクセル領域ごとにピクセル シェーダーが実行されます。A pixel shader runs for each 2x2 pixel area to support derivative calculations (which use x and y deltas). これは、示されているよりも多くのシェーダーの呼び出しが発生すれば、2x2 の最小クォンタムが満たされることを意味します (マルチサンプリングには依存しません)。This means that shader invocations occur more than is shown to fill out the minimum 2x2 quanta (which is independent of multisampling). シェーダーの結果は、サンプル単位の深度/ステンシル テストに合格した、カバーされている各サンプルについて書き出されます。The shader result is written out for each covered sample that passes the per-sample depth-stencil test.

通常、プリミティブのラスター化ルールは、以下の場合を除きマルチサンプル アンチエイリアシングによって変わりません。Rasterization rules for primitives are, in general, unchanged by multisample antialiasing, except:

  • 三角形の場合、ピクセルの中心ではなく、各サンプリング位置に対してカバレッジ テストが実行されます。For a triangle, a coverage test is performed for each sample location (not for a pixel center). 複数のサンプリング位置がカバーされている場合、ピクセル シェーダーは、ピクセルの中心で補間された属性によって 1 回実行されます。If more than one sample location is covered, a pixel shader runs once with attributes interpolated at the pixel center. 結果は、カバーされているサンプリング位置ごとに、深度/ステンシル テストに合格したピクセルに格納 (複製) されます。The result is stored (replicated) for each covered sample location in the pixel that passes the depth/stencil test.

    線は、線幅 1.4 の 2 つの三角形で構成された矩形として処理されます。A line is treated as a rectangle made up of two triangles, with a line width of 1.4.

  • 点の場合、ピクセルの中心ではなく、各サンプリング位置に対してカバレッジ テストが実行されます。For a point, a coverage test is performed for each sample location (not for a pixel center).

マルチサンプリング フォーマットは、「Load」を使用してシェーダーに読み戻すことができるレンダー ターゲットで使用することができます。これは、シェーダーがアクセスする個々のサンプルには解決が不要なためです。Multisampling formats can be used in render targets which can be read back into shaders using load, since no resolve is required for individual samples accessed by the shader. 深度フォーマットは、マルチサンプル リソースではサポートされていないため、レンダー ターゲットのみに制限されます。Depth formats are not supported for multisample resource, therefore, depth formats are restricted to render targets only.

型なしフォーマットではマルチサンプリングがサポートされており、リソース ビューで異なる方法でデータを解釈できます。Typeless formats support multisampling to allow a resource view to interpret data in different ways. たとえば、R8G8B8A8 型指定を使用してマルチサンプリングリソースを作成し、 _ R8G8B8A8 UINT 形式のレンダーターゲットビューリソースを使用してレンダリングした _ 後、R8G8B8A8 unorm データ形式でコンテンツを別のリソースに解決することができ _ ます。For instance, you could create a multisample resource using R8G8B8A8_TYPELESS, render to it using a render-target-view resource with a R8G8B8A8_UINT format, then resolve the contents to another resource with a R8G8B8A8_UNORM data format.

ハードウェアサポートHardware Support

API は、品質レベルの数によってマルチサンプリングのハードウェア サポートをレポートします。The API reports hardware support for multisampling through the number of quality levels. たとえば、品質レベルが 0 の場合、ハードウェアにおいて (特定のフォーマットおよび品質レベルで) マルチサンプリングがサポートされていないことを意味します。For example, a 0 quality level means the hardware does not support multisampling (at a particular format and quality level). 品質レベルが 3 の場合は、ハードウェアで 3 つの異なるサンプル レイアウトや解決アルゴリズムがサポートされていることを意味します。A 3 for quality levels means that the hardware supports three different sample layouts and/or resolve algorithms. 次のように仮定することもできます。You can also assume the following:

  • マルチサンプリングをサポートするフォーマットは、同じファミリー内のすべてのフォーマットについて同じ数の品質レベルをサポートします。Any format that supports multisampling, supports the same number of quality levels for every format in that family.
  • マルチサンプリングをサポートし、 _ unorm、 _ SRGB、snorm、または FLOAT 形式を持つすべての形式は、の _ _ 解決もサポートします。Every format that supports multisampling, and has the _UNORM, _SRGB, _SNORM or _FLOAT formats, also supports resolving.

マルチサンプル アンチエイリアシング時の属性の重心サンプリングCentroid Sampling of Attributes when Multisample Antialiasing

既定では、頂点属性は、マルチサンプル アンチエイリアシング時にピクセルの中心に補間されます。ピクセルの中心がカバーされていない場合、属性はピクセルの中心に対して補外されます。By default, vertex attributes are interpolated to a pixel center during multisample antialiasing; if the pixel center is not covered, attributes are extrapolated to a pixel center. (ピクセルが完全にはカバーされていないと仮定すると) 重心セマンティクスを含むピクセル シェーダー入力は、ピクセルのカバーされている領域内のいずれかの場所、おそらく、カバーされたサンプリング位置のいずれかでサンプリングされます。If a pixel shader input that contains the centroid semantic (assuming the pixel is not fully covered) will be sampled somewhere within the covered area of the pixel, possibly at one of the covered sample locations. サンプル マスク (ラスタライザー ステートで指定) は、重心計算の前に適用されます。A sample mask (specified by the rasterizer state) is applied prior to centroid computation. そのため、マスク アウトされたサンプルは重心位置として使用されません。Therefore, a sample that is masked out will not be used as a centroid location.

リファレンス ラスタライザーは、これと似たような方法で、重心サンプリングのサンプリング位置を選択します。The reference rasterizer chooses a sample location for centroid sampling similar to this:

  • サンプル マスクは、すべてのサンプルに指定可能です。The sample mask allows all samples. ピクセルがカバーされている場合、またはいずれのサンプルもカバーされていない場合は、ピクセルの中心を使用します。Use a pixel center if the pixel is covered or if none of the samples are covered. それ以外の場合は、カバーされている最初のサンプルが選択され、ピクセルの中心から始まって外側に移動していきます。Otherwise, the first covered sample is chosen, starting from the pixel center and moving outward.
  • サンプル マスクは、1 つを除くすべてのサンプルをオフにします (一般的なシナリオ)。The sample mask turns off all samples but one (a common scenario). アプリケーションでは、1 ビットのサンプル マスク値を順番に繰り返し、重心サンプリングを使用してサンプルごとにシーンを再レンダリングすることで、マルチパス スーパーサンプリングを実装できます。An application can implement multipass supersampling by cycling through single-bit sample-mask values and re-rendering the scene for each sample using centroid sampling. このためには、より詳細なテクスチャー ミップを適切に選択して、より高いテクスチャー サンプリング密度を実現できるように、アプリケーションで微分を調整することが必要です。This would require that an application adjust derivatives to select appropriately more detailed texture mips for the higher texture sampling density.

マルチサンプリングの場合の派生計算Derivative Calculations When Multisampling

ピクセル シェーダーは、微分計算 (隣接したピクセルのデータ間のデルタを取得して計算する) をサポートするために、常に 2x2 以上のピクセル領域を使用して実行されます (各ピクセル内のデータが、水平方向または垂直方向に単位間隔でサンプリングされていると仮定します)。Pixel shaders always run using a minimum 2x2 pixel area to support derivative calculations, which are calculated by taking deltas between data from adjacent pixels (making the assumption that the data in each pixel has been sampled with unit spacing horizontally or vertically). これは、マルチサンプリングに影響されることはありません。This is unaffected by multisampling.

重心サンプリングされた属性に対して微分が要求された場合、ハードウェア計算が調整されず、微分が不正確になることがあります。If derivatives are requested on an attribute that has been centroid sampled, the hardware calculation is not adjusted, which can cause inaccurate derivatives. シェーダーは、レンダー ターゲット空間の単位ベクトルを予測しますが、他のベクトル空間に関する非単位ベクトルを取得する場合があります。A shader will expect a unit vector in render-target space but may get a non-unit vector with respect to some other vector space. したがって、重心サンプリングされた属性から微分の要求があった場合には、アプリケーション側で警告を発行する必要があります。Therefore, it is an application's responsibility to exhibit caution when requesting derivatives from attributes that are centroid sampled.

実際には、微分と重心サンプリングを組み合わせないことをお勧めします。In fact, it is recommended that you do not combine derivatives and centroid sampling. プリミティブの補間された属性が、補外されないことが重要である状況で、重心サンプリングが役立つ場合があります。ただし、これには、プリミティブのエッジがピクセルを横切る位置を (連続して変更するのではなく) ジャンプするような属性や、LOD を算出するテクスチャー サンプリング処理で使用できない微分などのトレードオフが伴います。Centroid sampling can be useful for situations where it is critical that a primitive's interpolated attributes are not extrapolated, but this comes with tradeoffs such as attributes that appear to jump where a primitive edge crosses a pixel (rather than change continuously) or derivatives that cannot be used by texture sampling operations that derive LOD.

関連トピックRelated topics

付録Appendices

ラスタライザー (RS) ステージRasterizer (RS) stage