1

ライン ストリップをレンダリングするとき、ラインに沿ってフラグメントからストリップ全体の開始点までの距離をピクセル単位で取得するにはどうすればよいですか?

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、...)、ライン ストリップに関するその他の均一なデータ (ワールド空間単位での合計の長さ、セグメントの数など) を提供できます。

編集:ラインストリップの始点までのユークリッド距離を計算したくはありませんが、ライン全体に沿った距離、つまり現在のフラグメントまでのすべての投影された線分の長さの合計です。

4

2 に答える 2

0

2 つの方法があります。

頂点シェーダーを使用できます。ライン ストリップの開始座標を、ラインの各頂点の追加の値として追加します。その後、頂点シェーダーは開始点までの距離を計算し、補間してフラグメント シェーダーに渡すことができます。そこで、ピクセル値を受け取るためにそれらを再スケーリングする必要があります。

または、ユニフォームを使用して、各ライン ストリップの開始座標を頂点シェーダーに伝えることができます。そこでは、頂点座標が変換されるように変換し、フラグメント シェーダーに向かって移動する必要があります。そこで、それらをピクセル座標に変換し、実際のフラグメントまでの距離を計算する必要があります。

于 2014-09-24T13:28:32.933 に答える
0

ここで何かが足りないと思ったので、簡単な遠近法計算魔法で解決できます。私の探求の無意味さを指摘してくれてありがとう。

いつものように、問題を定式化することはすでに解決策の半分でした。何を探すべきか (「線の連続的なパラメータ化」) がわかっている場合は、論文に出くわすことができます。

フォレスター・コールとアダム・フィンケルスタイン。高品質のライン可視化のための 2 つの高速な方法。視覚化とコンピュータ グラフィックスに関する IEEE トランザクション 16(5)、2010 年 2 月。

まさにこの問題を扱っています。解決策は、derhass が既に提案したものと似ています。Cole と Finkelstein は、GPU でフレームごとに計算するセグメント アトラスを使用します。各フラグメントのラインに沿った位置を追跡するために、投影されたすべてのライン ポイントのリストが含まれています (可視性などの他の属性とともに)。論文 (ドラフト) は 2009 年にさかのぼるため、このセグメント アトラスはフレーム バッファーで計算されます。計算シェーダーで同じ方法を実装し、結果をバッファーに格納する方法が適しているようです。

于 2014-09-25T13:38:09.477 に答える