2

関連付けられた不確実性の値に基づいて、さまざまなポイントのサイズが異なるポイント クラウドを実装しようとしています。たとえば、この値がゼロの場合、サイズは一定である必要があり、1 に近づいている場合、それらのポイントの半径はますます変化するはずです。最初に、ポイントのサイズが大きくなり、最大値に達した後、最小値まで減少する必要があります。この現象を説明する関数は次のようになります。

pointSize = x +/- c * pointUncertainty, where x = standard point size 
                                              c = scaling constant

私が読んだことから、これは統一タイマー変数を頂点シェーダーに渡し、そこでポイントサイズを計算することで実現できる可能性があります。ただし、すべてのポイントは同時に変化する必要があります。つまり、不確実性が 1 のポイントと不確実性が 0.5 のポイントは、pointSize の最小値と最大値に同時に到達する必要があります。さらに、プロセス全体がフレームレートに依存するべきではありません。

これを実現する最善の方法、増加-減少-増加-パターンを最適に実装する方法、必要な OpenGL (4.2) コマンドをどこに置くべきかはわかりません。

編集: このようなアニメーション効果がどのように達成されるかのプロセス全体が不明であるため、この質問に対する回答を得たいと思っています。

4

2 に答える 2

3

各ポイントの値を含むtexture1Dを渡すことができます。次に、 texelFetch()を使用して値を取得します。アトミックカウンター(OpenGL 4.2を使用している場合)またはgl_vertexIDを使用してこれを行うことができます。また、この質問とこれを確認してください。 1つは、受け入れられた回答は、UBOのような追加のソリューションも示唆しています。ただし、ポイントクラウドがかなり大きい場合は、バッファテクスチャが必要です。

バッファテクスチャアプローチを取りましょう:

  • テクスチャバッファを作成し、ポイントのターゲットサイズを定義する値を入力します(設定方法については、上記のリンクを参照してください)。
  • 頂点シェーダーでは、texelFetchサンプリングを介してこれらの値にアクセスします。前述したように、gl_VertexIDを使用して、現在の頂点でサンプリングできます(このようなもの)。

    均一なsamplerBufferpointsBuffer;

    void main(){float destSize = texelFetch(pointsBuffer、gl_VertexID).x; ...}

  • ここで、ポイントサイズをデフォルトから目標サイズにある程度の量に基づいて補間する必要があります。はい、0から1の範囲のタイマー入力で作業できます。mix ()組み込みメソッドを使用して、ポイントサイズを補間します。デフォルトの宛先。もっと楽しくするには、sin()またはcos()ベースの時間を渡します:)

  • あなたがOpenGLsuperbibleについて述べたように、テクスチャバッファがどのように機能するかを説明する章があります。もう一度読んでください。あなたがやろうとしているのはロケット科学ではなく、初心者レベルでもありません。 OpenGLでの作業。

于 2013-01-07T08:23:20.690 に答える
1

まず第一に...あなたの答えをありがとう。頂点シェーダーだけを使用して解決しました。これが私が望んでいた解決策だったと思います。おそらく、同じ問題を抱えている人々は、これから恩恵を受けることができます:

私の頂点シェーダーの一部は次のようになります。

 ... 
 "  float standardPointSize = 100.0;"
 "  float timeScale = standardPointSize / my_loopDuration;"
 "  float currentTime = mod(my_time, my_loopDuration);"
 "  float offset = currentTime * timeScale * in_uncertainty;"
 "  if(currentTime < my_loopDuration / 4)"
 "  {"
 "      gl_PointSize = standardPointSize - 4 * offset;"
 "  }"
 "  else if(currentTime >= my_loopDuration / 4 && currentTime < my_loopDuration / 2)"
 "  {"
 "      gl_PointSize = standardPointSize - standardPointSize * in_uncertainty + 4 * offset - 1 * in_uncertainty * standardPointSize;"
 "  }"
 "  else if(currentTime >= my_loopDuration / 2 && currentTime < 3 * my_loopDuration / 4)"
 "  {"
 "      gl_PointSize = standardPointSize + 4 * offset - 2 * in_uncertainty * standardPointSize;"
 "  }"
 "  else if(currentTime >= 3 * my_loopDuration / 4 && currentTime <= my_loopDuration)"
 "  {"
 "      gl_PointSize = standardPointSize + standardPointSize * in_uncertainty - 4 * offset + 3 * in_uncertainty * standardPointSize;"
 "  }"
 ...

my_time と my_loopDuration は均一変数です。最初のものは glutGet(GLUT_ELASED_TIME) で設定され、2 つ目は任意の数値です。

于 2013-01-26T18:47:33.703 に答える