ライン ストリップをレンダリングするとき、ラインに沿ってフラグメントからストリップ全体の開始点までの距離をピクセル単位で取得するにはどうすればよいですか?
3D で 2 点間の 1 つの線分をレンダリングする場合、画面空間でのこれらの 2 点間の距離は、単純に 2D 投影間のユークリッド距離です。このセグメントをレンダリングすると、各フラグメントの線に沿って開始点から画面空間の距離を補間できます (GLSL ではレイアウト修飾子 noperspective)。
ただし、ライン ストリップをレンダリングする場合、これは機能しません。ジオメトリ シェーダーでは、以前のすべてのセグメントではなく、現在のセグメントの開始点と終了点に関する情報しか得られないためです。したがって、上記の方法で計算できるのは、ライン ストリップの始点ではなく、各フラグメントから線分の始点までの距離だけです。しかし、これは私が達成したいことです。
何のためにそれが必要ですか: 定型化された線のレンダリング。たとえば、ポリラインをそのスクリーン カバレッジ (ピクセル単位の長さ) に従って色付けする、50 ピクセルごとに距離マークを追加する、ライン ストリップに沿って複数のテクスチャを交互に配置する、...
私が現在行っていることは次のとおりです。
- ラインのすべてのポイントを事前に CPU に投影する
- 投影されたすべての線分の長さをピクセル単位で計算する
- 長さを頂点属性としてバッファーに格納します (頂点 0 は距離 0、頂点 1 はセグメントの長さ 0->1、頂点 2 は長さ 0->1 + 1->2、...)
- ジオメトリ シェーダーで線分を作成し、CPU で計算された距離を使用します。
- 各フラグメントの遠近補正なしで値を補間します
これは機能しますが、これを行うためのより良い方法が必要です。フレームごとに CPU に数百または数千のライン ポイントを投影することは現実的ではありません。ジオメトリ シェーダーでこれを計算するスマートな方法はありますか? 私が持っているのは、現在の線分の始点と終点のワールド空間位置です。ラインに沿ったライン ストリップの始点までの両方のポイントのワールド空間距離があります (ここでも頂点属性 0, 0- >1、0->1 + 1->2、...)、ライン ストリップに関するその他の均一なデータ (ワールド空間単位での合計の長さ、セグメントの数など) を提供できます。
編集:ラインストリップの始点までのユークリッド距離を計算したくはありませんが、ライン全体に沿った距離、つまり現在のフラグメントまでのすべての投影された線分の長さの合計です。