OpenGL で多かれ少なかれ滑らかなマルチセグメント ラインを描画しようとしています。ただし、線の太さが約 3 を超えると、セグメント間の結合がシームレスにならないことがわかりました。それらの間にギャップが生じることもあります。これらの結合をスムーズでギャップレスにする良い方法はありますか? Java の BasicStroke.JOIN_MITER に相当するものを探しています。
6 に答える
OpenGL を使用して思考線を描画する最も一貫性のあるポータブルな方法は、カメラ位置合わせ (ビルボードとして知られている) ポリゴンを使用することです。OpenGL API の実装が異なると、線の終点が異なる方法で処理GL_LINE_SMOOTH
され、プラットフォームに応じて大幅に異なる結果が生成されます。一部の実装では、1 より大きい太さの線は不明確であると見なされます。glLineWidth マンページに記載されているように: [アンチエイリアスされた行の場合] 幅 1 のみがサポートされることが保証されています。その他は実装に依存します。
そうは言っても、私はこの問題に対処するために単純な 2 パス ハックを使用しました。
- 深度バッファへの書き込みを無効にする glDepthMask(GL_FALSE)
- 希望の太さの滑らかな線を描く
- すべての線の終点で同じサイズの平滑化された点を描画します。(このステップはギャップを埋めるために必要ないかもしれませんが、線が交わる点を丸くし、すべてが少し滑らかに見えるようにする必要があります)
- glDepthMask(GL_TRUE) を書き込むための深度バッファを再度有効にします。
深度バッファの設定をいじってみるのもいいかもしれません。ライン間の「ギャップ」は、2 番目のラインが背景とアルファ ブレンドされたピクセルの深度テストに失敗したことが原因である可能性があります。
GL_LINE_SMOOTH でアンチエイリアスを有効にすると、線の描画方法が少し変わります。あなたはそれを試すことができます。また、ブレンドを機能させるには、ブレンドを有効にする必要があることに注意してください。
主なことは、細い四角形を使用して線を描画する方法のすべての側面を制御できるわけではなく、独自の DrawThickLine 関数を記述した後は、それ以上機能しなくなるということです...
四角形を描画し、テクスチャまたはフラグメント シェーダーを使用して点描します。フラグメント シェーダーは、アンチエイリアシングも提供できます。
何かを滑らかにするために、ベジエ曲線やその他の形式のスプラインに頼ることができます。これが OpenGL に組み込まれていないことに驚きましたが、Web サイトにはOpenGL を使用してベジエ曲線を生成するサンプル プログラムがあります。
線の両端を半分の太さで描きすぎます。これにより、「ギャップ」が取り除かれますが、滑らかな線ではなく、よりシャープな線の結合が得られます。