高速アンチエイリアス処理された線の描画


11

ブレゼンハムの線アルゴリズムは、高速整数演算(加算、減算、および2による乗算)のみを使用して直線を描画する方法です。ただし、エイリアス行が生成されます。アンチエイリアスされた線を描画するための同様の高速な方法はありますか?


1
いくつかの質問... CPUまたはGPUで描画ロジックを実行していますか?また、整数ベースのアルゴリズムまたは浮動小数点を探していますか?
アランウルフ

5
@ AlanWolfe、CPU上の整数アルゴリズム-Bresenhamのアルゴリズムが設計されたのと同じ環境。
マーク

3
en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithmは古典的なものですが、Wikipediaのページはかなり中途半端で、私はこの論文にアクセスできません。基本的なグーグルを行うことでこれを見つけるのは非常に簡単なので、これは面倒な質問のように感じます。
yuriks 2015

2
大声で考えるだけで、マルチピクセルの太い線を描画するためにブレゼンハムを適応させるのは簡単だと思います。次に、数学的な理想的なラインから各ピクセルの中心までの距離を計算し、フォールオフ関数を適用することにより、アンチエイリアスを実行できます。
ネイサンリード

2
ただし、コメントに正しいマークを付けることはできません。
マーク・

回答:


9

アンチエイリアスされた線を描画するための同様の高速な方法はありますか?

いいえ、定義によりアンチエイリアスされたラインはより多くのピクセルに触れるためです。このようなアルゴリズムは遅くなります。


ソフトウェアラスタライザでは、アンチエイリアスされた線を描くユビキタスな方法は、Xiaolin Wuの線アルゴリズムです。実装するのは難しくなく、とにかくそのリンクに異常に高品質の疑似コードがあります。

ハードウェアラスターパイプでは、ラインプリミティブはデフォルト(またはユーザー指定)のジオメトリシェーダーによってスクリーンスペースクワッドに拡張され、2つの三角形として描画されます。その後、通常の方法でアンチエイリアスを適用できます。

レイトレーサーには、さまざまなオプションがあります。実際に1Dオブジェクトをどのように描画するかについて考えることは価値があります。たぶんシリンダーのように(シャドウ)!これにより、パースペクティブ/短縮の問題が発生することに注意してください。明確な一般化はありません。次に、明らかに、何をするにせよ、それをスーパーサンプリングするだけです。


「とにかく、そのリンクに異常に高品質の疑似コードがある」と私は同意しません。その疑似コードは、Web上の無数の場所で使用されているように見えますが、Wuのアルゴリズムの適切な実装ではない可能性があります。Wuの元のアルゴリズムは両端から内側に向​​かって描画され、実際にはブレゼンハムのアルゴリズムより高速でした。私は、リンクされたウィキペディアの記事に投稿されたものではなく、ウーの実際のアルゴリズムについて話しています。
タコ

@タコ[特に速いビットで漠然とした懐疑論を表現しているが、反駁または確認するためのコンテキストが欠けている—そうであれば、ソース、修正、および編集はもちろん歓迎されます。]
imallett

何を数えるかに依存します。両端から内側に描画すると、Wuのアルゴリズムは半分の計算を行いますが、2倍のピクセル書き込みを行います。ウィキペディアにリンクされたウーの論文の表1を参照してください。したがって、シリアル接続でTFTに書き込む場合のように、ピクセル書き込みが高価な場合、WuのアルゴリズムはBresenhamのアルゴリズムよりも高価です。(私は、ブレゼンハムのアルゴリズムが対称性を使用できない理由がわからないことを認めなければなりません。)
Jan-ÅkeLarsson

1
しかし、@ Octopusに同意します。「一端から他端への描画」を受け入れても、整数演算が全体で使用される場合にのみ、疑似コードはWuのアルゴリズムです。オンラインで見たコードでは、浮動小数点演算が使用されていますが、これは大きな変更です。Wuの論文では、アルゴリズムは整数演算(または実際には固定小数点演算)のみを使用しています。
月-エイクラーソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.