アンチエイリアス サンプル

マルチサンプリングは、各ピクセル色を決定する複数のサンプル ポイントを使用して、高解像度の表示を模倣することでエイリアスを減らそうとします。このサンプルは、ビデオ カードによってサポートされているさまざまなマルチサンプリング テクニックが、シーンのレンダリングにどのように影響を与えるかを示しています。マルチサンプリングが効率的にエイリアスを抑制しても、特定の状況下では独自の不自然な効果が発生することがあります。サンプルに示されているように、重心サンプリングによって、マルチサンプリングで発生しやすい不自然な効果が抑制されます。重心サンプリングは、ピクセル シェーダー 2.0 モデル以降でサポートされています。

Bb172267.Antialias(ja-jp,VS.85).gif

    

このサンプルで、複雑なピクセルレベルの詳細をさらにはっきりと表示するには、拡大鏡ツールを使用して画面をズームします。ツールを起動するには、[実行](Run) ダイアログで「拡大鏡」と入力します。

Path

ソース : (SDK ルート)\Samples\C++\Direct3D\Antialias
実行可能ファイル : (SDK ルート)\Samples\C++\Direct3D\Bin\x86 or x64\Antialias.exe

エイリアシングおよびアンチエイリアシング

ラスター表示では、限られた数のピクセルを使用してシーンを表示しています。そのため、表示解像度が高くなるにつれて、表示されるシーンの精度は高まります。高周波数データを表示するのにピクセルが十分でないシーンでは、不自然な効果が発生することがあります。これはメッシュ エッジで最も顕著に現れます。ここでは、直線データはピクセルの固定数で概算されるため、階段パターンが発生します。この形式のエイリアシングは「ジャギー」と呼ばれ、ポリゴンが画面上で動いている場合に特に顕著に現れます。図 1 は、マルチサンプリングが無効な場合に、サンプルの三角形のシーンでのエイリアスを示しています。

Bb172267.Antialias1(ja-jp,VS.85).gif

図 1:ポリゴン エッジの階段パターンは、エイリアシングの不自然な効果として頻繁に発生します。

エイリアシングは、ラスター化の自然な結果です。ラスター表示とポリゴンのラスター化について確認するには、「テクセルからピクセルへの直接的なマッピング」を参照してください。個別のピクセルが、隣接するピクセルと区別できるくらい大きい場合は、エイリアシングを完全に削除する方法はありません。最終的に、エイリアシングだとわからないくらいにピクセルを小さくするのが最良の方法です。また、インクジェット プリンターはラスター出力を発生させることを忘れないでください。ただし、プリントアウトでエイリアシングを見つけるのはほとんど不可能です。なぜなら、1 平方インチの用紙によく使われている解像度は、1 インチあたり 300x300 ドット (dpi) だからです。コンピューター ディスプレイでよく使われている 1 平方インチの解像度は、72x72 ピクセルです。比較してみると、モニターよりも印刷されたページでのドット数が 17 倍以上も多いことになります。ピクセルを小さく見せるもうひとつの方法として、モニターから離れるという手段もあります。モニターとの距離を十分取ることによって、「ジャギー」が見えなくなります。ある一定の距離以上になると、同じ平均カラーを持つ場合、4 ピクセルのクラスターと 4 倍以上大きいピクセルを区別することはできません。

この論理に従うと、エイリアスを抑制する唯一の方法は、オーバーサンプリングであるという結論になります。オーバーサンプリングは、表示解像度よりも高い解像度でシーンをレンダリングするテクニックです。たとえば、表示解像度が 800x600 ピクセルで、レンダリングするシーンが 1600x1200 の場合、1 ピクセルが表示を担当するのは、シーン テクスチャーの 2x2 領域になります。2x2 領域を概算する最高の方法は、4 色すべての平均を求めることです。ただし、これはシーンの不自然な効果を生じさせるエイリアスを抑制する利点がありますが、大量のバックバッファーを必要とするため、塗りつぶしコストが高額になります。オーバーサンプリングは、Direct3D では実装されていません。ここで述べた不利益のためお勧めしません。

エイリアシングを抑制するもう一つのテクニックとしては、マルチサンプリングがあります。マルチサンプリングは、各サブピクセルの色を実際に計算するのではなく、サブピクセルの平均的な動作を模倣することによって、オーバーサンプリングの経費を削減します。

ラスター化は、ポリゴンのエッジの場所とピクセルの中心の場所 (サンプリング ポイント) を比較します。ポリゴンがピクセルの中心をカバーする場合、ポリゴンはピクセルの色を決定します。マルチサンプリングは、ピクセルの中心ではなく、サンプリング ポイントのパターンを使用してラスター化を行います (図 2 参照)。

Bb172267.Antialias2(ja-jp,VS.85).gif

図 2:1 つのポイントのサンプル ピクセル カラーと 4 つのポイントのマルチサンプル ピクセル カラー

マルチサンプリング中に、最終的なピクセル カラーは、サンプルされたピクセル カラーとポリゴンでカバーされるサンプル数によって決定されます。図 2 の上の例では、ポリゴンは 1 つのサンプリング ポイントのみをカバーしているため、ピクセル カラーは 100 % そのポリゴンのカラーに なります。図 2 の下の例では、4 つのサンプリング ポイントのうち 2 つのみがポリゴンによってカバーされているため、ポリゴンのカラーの 50 % がピクセル カラーになります。

マルチサンプリング中に、ラスター化プロセスによって、各ピクセル内にある複数のサンプル ポイントがテストされます。そのため、マルチサンプリングにはオーバーサンプリングと同じくらい高いコストがかかるように見えます。ただし、マルチサンプリングでは各サンプリング ポイントでピクセル パイプラインを実行しません。一方、1 つのピクセル サンプルは、ピクセルの中心でカラーを決定します。また、ポリゴンによってカバーされているサンプリング ポイントの数にピクセル カラーを乗算してカラーのパーセンテージが算出されます。結果として、マルチサンプリングでは、オーバーサンプリングで必要なサンプリングのコストをかけることなく、ピクセル カラーの精度を高めることができます。図 3 では、マルチサンプリングによって、図 1 の同じシーンで見られる「ジャギー」が大幅に減っている様子が示されています。

Bb172267.Antialias3(ja-jp,VS.85).gif

図 3:マルチサンプリングによって明らかにエイリアスが減少している様子

Direct3D がサンプリング ポイントのパターンを指定せずに、サンプリング ポイントの数のみを指定するということが一番重要です (図 4 に示されているように)。つまり、まったく同じマルチサンプリング設定の全く同じシーンが、使用しているグラフィック カードによって異なって見えるのです。

Bb172267.Antialias4(ja-jp,VS.85).gif

図 4:さまざまなベンダーのマルチサンプリング パターン

Direct3D はサンプル ポイントのレイアウトは指定せず、サンプル ポイントの数のみを指定します。そのため、ハードウェア ベンダーは、サポートされているマルチサンプリング モードのパターンを決定する必要があります。使用できるマルチサンプリング パターンは、上記の 4 つのサンプルになります。

重心サンプリング

前述のように、マルチサンプリングの効率に関して重要なのは、ピクセル パイプラインがピクセルごと、ポリゴンごとに 1 回ずつしか実行されないことです。ポリゴンのカラーを決定するのに使用される画面位置は、通常はピクセルの中心になります。ただし、これには次の問題があります。ポリゴンが 1 つまたは複数のサンプル ポイントをカバーしていてもピクセルの中心をカバーしていない場合は、ポリゴンのカラーは実際にはポリゴンにないポイントで決定されてしまいます (図 5 参照)。

Bb172267.Antialias5(ja-jp,VS.85).gif

図 5:ポリゴンは 4 つのサンプリング ポイントの内 2 つをカバーしているので、ピクセル カラーの 50 % にこのカラーが使用されます。

これは通常は問題にはなりません。ただし、ポリゴンがテクスチャーされている場合は、サンプルされたテクセルはポリゴンの UV 境界外になることを忘れないでください。開発者が、テクスチャーの変更を最小限に抑えるため、複数の小さなテクスチャーをパックして、1 つの大きなテクスチャー (Texture Atlas と呼ばれる) にしていることがあります。たとえば、ライト マップなどはこの方法で格納されています。Texture Atlas が高コントラスト差に対応している場合、ピクセルの中心でのサンプリングによってポリゴン エッジで不自然な効果が発生します。これは、ポリゴンがビュー ベクトルに並行に回転する場合に、発生しやすくなります。また、ポリゴンが高視射角にある場合、ピクセルの中心にある補間テクスチャー座標はポリゴンの UV 境界外になります。

マルチサンプリングの種類に D3DMULTISAMPLE_NONE を設定し、テクスチャー フィルタリングに D3DTEXF_POINT を設定してサンプルの三角形シーンを実行します。テクスチャーの不自然な効果というラベルの下には、白以外のピクセルは確認することができません。マルチサンプリングを有効にすると、表示される三角形のアウトラインが見えるようになります。図 6 のようになります。

Bb172267.Antialias6(ja-jp,VS.85).gif

図 6:マルチサンプリングのテクスチャーの不自然な効果の例 (左)。このテクスチャーで三角形をレンダリングした場合 (右)。

図 6 の左側は、テクスチャー座標がポリゴンの UV 境界外で補間されている場合に発生するテクスチャーの不自然な効果を示しています。この場合、ポリゴンは、4 つのサンプリング ポイントの内 2 つをカバーしていますが、ピクセルの中心はカバーしていません。図 6 の右側は、テクスチャーの不自然な効果を強調する三角形に適用した例です。ブラック テクセルは、三角形の UV 座標境界の外側にあります。三角形の UV 境界に含まれるまたは交差されるテクセルでテクスチャーされている三角形はホワイトになります。その他のテクセルはブラックになります。そのため、テクセルがサンプルされている UV 境界外にある場合を除いて、ホワイトの背景では三角形は表示されません。線形および異方性フィルタリングでは、テクセルからのサンプルは UV 境界の外側にあるのが一般的です。これは、バイリニア フィルタリングの動作方法と一緒です。

テクスチャーの不自然な効果は、マルチサンプリングを使用してポイントのフィルタリングを行った場合に発生します。マルチサンプリングはピクセルが中心にない場合でもサンプリング ポイントがカバーされているすべてのピクセルを含む三角形のラスター化エリアまで対象にするからです。この問題を解決するには、重心サンプリングを使用します。これは、ポリゴンのカラーを決定するのに使用される位置が、ポリゴンによってカバーされているサンプリング ポイントのすべての中心になるように調節するものです。この問題を解決する重心サンプリングは、図 7 のようになります。

Bb172267.Antialias7(ja-jp,VS.85).gif

図 7:マルチサンプリングと重心マルチサンプリング

図 7 では、4 つのポイントのマルチサンプリング パターン (左側)と、4 つのポイントの重心マルチサンプリング パターンを対比させています。ポリゴン カバレッジは、グレー シェーディングで示されています。4 つのポイントのサンプリング パターンは青の点で、テクスチャーのサンプリング位置は赤の点で示されます。

重心サンプリングが有効になると、ポリゴン カラーの決定に使用されたサンプルされたピクセルの位置は、ポリゴンによってカバーされているサンプリング ポイントの重心になるように調節されます。これによって、重心のサンプル位置が常にレンダリングされるポリゴン内にあることが保証されます。[重心サンプリング](Centroid sampling) チェック ボックスをオンにすると、テクスチャーの不自然な効果というラベルが再び空白になります。これは、重心サンプリングが三角形の UV 境界に対する補間テクスチャー座標では制限されていることを意味します。重心サンプリングは、自動的にカラー セマンティクスを持つ各ピクセル シェーダーの入力に対して有効になります (セマンティクス (DirectX HLSL) を参照)。また、すべての HLSL ピクセル シェーダー入力での重心サンプリングは、ここで示されているように重心セマンティクスを付加することで有効にできます。

//--------------------------------------------------------------------------------------
// Texture - Point sampled (centroid)
//--------------------------------------------------------------------------------------
float4 TexturePointCentroidPS( float4 TexCoord : TEXCOORD0_centroid ) : COLOR0
{
    return tex2D( PointSampler, TexCoord );
}

同様に、アセンブリ シェーダーで重心サンプリングを有効にするには、重心セマンティクスを宣言に付加してください。

dcl_texcoord0_centroid v0

重心サンプリングは、ピクセルの変化割合の計算には影響を与えません。これは、ミップマップ レベルがピクセルの中心で変化率計算に選択されていることを意味します。また、重心サンプリングは上記で説明したように、主に Texture Atlas で使用する必要があります。すべてのテクスチャーが直接メッシュにマップされているテクスチャーを使用する場合、重心サンプリングを行うと、わずかにテクスチャーのエラーが発生します。

サンプルの球のシーンとサンプルのクワッドのシーンには、チェッカー パターンでテクスチャーされた低テッセレートと高テッセレートのメッシュが含まれます。さまざまなマルチサンプリング、フィルタリング、および重心サンプリングの設定を試し、シーンへの影響を調節してみてください。

参考文献