0

OpenGL を使用した MSAA。

「glutSolidSphere」を使用して白い球を描き、シルエットの「dot(Normal, CameraVec) < threshold」を黒で塗りつぶしました。
そして、内側の白い円の輪郭に奇妙な結果が見つかりました。MSAA が機能していないようです。
ちなみに、黒丸の輪郭(一番外側)ではうまくいきました。

サンプル数を増やせば、内側の白丸の輪郭でもうまくいきます。
サンプルの解決はフラグメントシェーダーの後に発生するため、サンプルの数に関係なくうまく機能するはずです。

これは正しい結果ですか?はいの場合、なぜですか?

以下は、4 サンプル (左) と 32 サンプル (右) の結果です。

MSAA×4 MSAA x32

4

1 に答える 1

2

MSAA は、ポリゴンのエッジと交差を滑らかにするのに役立ちます。シェーダー コードによって作成された鋭い遷移を滑らかにすることは何もしません。

MSAA の背後にある主なアイデアは、フラグメント シェーダーがフラグメントごとに 1 回だけ実行されるということです。各フラグメントには複数のサンプルがあり、カバレッジはサンプルによって決定されます。これは、フラグメントの一部のサンプルがレンダリングされたポリゴンの内側にあり、一部が外側にある可能性があることを意味します。フラグメント シェーダーの出力は、カバーされたサンプルのみに書き込まれます。しかし、フラグメント内のカバーされたすべてのサンプルは同じ値を取得します。

深度バッファーには、サンプルごとの解像度もあります。つまり、ポリゴン間の交差も、MSAA によって生成されたスムージングの恩恵を受けます。

MSAA がどのように機能するかを理解すると、シェーダーに適用されたロジックの結果である可能性がある、ポリゴン内部の急激な遷移に対しては何もしないことがわかります。この場合にスムージングを実現するには、サンプルごとにフラグメント シェーダーを評価する必要がありますが、これは MSAA では発生しません。

MSAA は、比較的最小限のオーバーヘッドで、多くのユース ケースに対して十分なアンチエイリアシングを実行するため、魅力的です。しかし、お気づきのように、すべての場合に十分ではないことは明らかです。

これについてできることは、ここでの回答の範囲を超えています。主な方向は 2 つあります。

  • シェーダー コードで急激な遷移が生成されるのを回避できます。標準のテクスチャリングを使用する場合は、ミップマップを使用すると役立ちます。手続き型遷移の場合、おそらくグラデーション値に基づいて、コードでそれらを滑らかにすることができます。
  • 別のアンチエイリアシング方法を使用できます。ここで言及するには多すぎます。スーパー サンプリングを使用して完全なアンチエイリアシングを実現するのは簡単ですが、非常にコストがかかります。ほとんどの方法は、あまりオーバーヘッドを追加せずに、単純な MSAA よりも優れた結果を得るために妥協しようとします。

32x MSAA で内側のエッジがいくらか滑らかになるという事実に、私は少し当惑しています。それは期待されていないと思います。ダウンサンプリング中に何らかの形のスムージングを生成する何かが起こっているのではないかと思います。

于 2015-11-20T04:40:44.133 に答える