前書き
メインラインのベクターグラフィックスレンダリングエンジンの多くには、アルゴリズム上の欠陥があります。これらは、各シェイプを個別にレンダリングし、ピクセルカバレッジを計算してアンチエイリアスを作成してから、それらを重ね合わせます。はい、それは簡単ですが、正しい解決策はさらに簡単です。
これは、透明度によってカバレッジを膨らませるので、融合の問題につながります。アルファブレンディングは、状況を正確に表さないルールに従います。たとえば、50%カバーされているピクセルが、50%補完カバーされているピクセルに隣接している場合、100%のカバレッジではなく、75%のカバレッジになります。 。これがどのように見えるかは、アルゴリズムの調整方法やその他の詳細によって異なりますが、本質的にはこれは既知のエラーです。誰かが、さまざまなエンジンエラーを文書化し、それをどのように改善できるかを示す論文を書くという困難を乗り越えました。
画像1:完全に代表的ではないサンプル。上の行に拡大されたエラーを示す三角形でできた形状をレンダリングしたサンプル。SVGソース
この問題には、単純な単純な解*があり、カバレッジ計算を行わずにスーパーサンプルを使用して、画像をフィルターで絞り込みます。おまけとして、ボックスフィルタリングよりも優れた画像再構成アルゴリズムを使用できます(「ピクセルは正方形ではありません3」を参照)。現在のソリューションと同等の速度を持つソリューションもあり、これらのソリューションはハードウェアラスタライゼーションパイプラインで実行する方がはるかに簡単です(この問題を回避するために構築されているため、GPUでこのエラーが表示されることはほとんどありません)。
これもコストがかからない問題ではありません。グラフィックデザインに携わっている多くの人が、この問題を手動で回避するために重要な時間を費やして、ここでオーバーラップがあり、オーバーラップがないことを確認して、コンピューターがそれらの問題を修正するようにします。そして多くの場合見事に失敗します。しかし、クライアントはなぜエラーがそこにあるのか気にせず、修正する必要があります。
質問
エラーはどのように伝播しますか?それらはすべて同じエラーを実行しているため、アルゴリズムに同じソースを使用していると結論付けることができます。デザイナーがこのアルゴリズムを選択した原因は何でしょうか?3Dプログラマーだけがこのエラーを認識し、2Dプログラマーが認識しなかったのに、APIと教育でその部分を成文化したのはなぜですか?
このエラーがそれ以上伝播しないようにする方法を教えてください。
補遺(これについては質問していません)
*どうやら、スーパーサンプリングは問題なく機能するという私の主張は並外れており、並外れた証明が必要です。スーパーサンプリングが機能するための鍵は、スーパーサンプリングがカバレッジ処理を行わないことです。本質的に、スーパーサンプラーは各サンプルをポイントサンプルとして扱います。ポイントサンプルは、基になる領域を想定していないため、アルファ比較が発生しない場所では発生しません。
答えの1つで説明されているように、それが一貫して機能するために。一貫性を保つために、サンプルを整数サンプリングで処理する必要があります。これにより、一度スクリーンスペースに変換された各ポイントが、等しい座標に対してまったく同じソリューションを取得し、サンプルがピクセル境界によって2回シェーディングされないことが保証されます。これを行うには、サンプルが左下のサンプルである場合、サンプルがピクセルをトリガーしない可能性があります(したがって、正確なエッジは> vs <=で処理されるというルールを作成します)。1つを除くすべてのコンソールグラフィックカードは、このように機能します。これにより、余分なデータをキャッシュしたり、近くで追加のテストを行ったりする必要がなくなります。このソリューションは、カバレッジベースのソリューションよりも安定しており、より一般的で一貫しています。
アルゴリズムは元のコードとまったく同じで、コードが少し少なく、サンプルが少し多くなっています。したがって、カバレッジベースのアルゴリズムと同じかそれ以上ではありません。これは、グラフィックスカードだけでなく、他のほぼすべての信号処理分野で古くからこのような方法を使用してきたためです。
この方法には欠点がありますか?まあ、単純な仮定をすると、少し遅くなります。理論的には、カバレッジラスタライザよりも速い漸近的な振る舞いをします。レイトレーサーのように、典型的なシーンではまだ同等です。また、畳み込みベースのエフェクトの使用を実装するのがより困難になる可能性があります。