問題タブ [geometry-shader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
480 参照

opengl - GL_TRIANGLES_ADJACENCY_EXT を使用したテッセレーションおよびジオメトリ シェーダー

いくつかの SRTM データから地形をレンダリングする小さなプログラムがあります。

私は glsl の新しい機能で少し遊んでいます。vs、tcs、tes、gs、および fs の作成に成功しました。ここで、gs はパススルー シェーダーのみでした:

今、tcs と tes でさらに三角形を追加し、新しい法線を計算する必要があるため、gs で三角形の隣接オプションを使用して計算する必要があると思うので、4 つの三角形の 6 つの頂点にアクセスできます。しかし、コードを変更すると:

何も描画されません。テッセレーションがアクティブな場合、描画配列で GL_PATCHES を使用する必要があることはわかっていますが (この方法で作成しました)、この gs の動作を確認するために何ができるかわかりません。

ただし、私の目標は、テッセレーション後に新しい法線を計算することです。誰かが最終的にどこで計算するのを手伝ってくれますか?

0 投票する
0 に答える
810 参照

opengl - ジオメトリ シェーダー GLSL からの条件付き出力

ジオメトリ シェーダーで出力を切り替える方法、具体的には次の 2 つの出力を見つけようとしています。

私は星団のレンダリングを行っており、ジオメトリ シェーダーで生成されたスプライトを使用して 100,000 個以上の星のデータセットを持っています。ただし、スプライトの「ハロー」は、ターゲットの星に近づいた場合にのみ表示されます。

ジオメトリ シェーダー

フラグメントシェーダー

最近、ジオメトリ シェーダーのストリームに遭遇しましたが、これが私のインスタンスでどのように行われるかを示す適切な例が見つかりません。

さらにコードを投稿する必要がある場合はお知らせください。

0 投票する
1 に答える
790 参照

c++ - 4 つの頂点の間の点の Y 位置をどのように見つけますか? HLSL

4 つの頂点からなる 2 つの三角形からなるタイルで構成されるゲーム用のグリッド テレインがあるとします。4 つの頂点の間のポイントの Y (上) 位置をどのように見つけますか?

地形

私はこれを試しました:

z/yOffset は、タイルの最初の頂点からの z/y オフセット (パーセント / 100) です。

これは、上記が平面で機能する可能性のある三角形から作成された地形に関係していると思います。よくわかりませんが、何が問題なのか知っている人はいますか?

これは、ここで何が起こっているかをよりよく説明するかもしれません:

ここに画像の説明を入力

上記のコードで、"heights[]" は周囲の頂点 v0-3 の Y 座標の配列です。三角形 1 は頂点 0、2、1 で構成されています。三角形 2 は頂点 1、2、3 で構成されています。

x、y座標がv0-3の間にあるときに、p1の座標Yを見つけたいと思います。

そこで、この関数を使用して、ポイントがどの三角形の間にあるかを判断しようとしました:

これは私が期待した結果を与えていません

次に、各三角形内の点 p1 の y 座標を見つけようとしています。


以下を使用して、正しい三角形を見つけます。

上記のコードを正しいクロス関数を使用するように修正すると、問題が解決したようです。

ここに画像の説明を入力

0 投票する
1 に答える
867 参照

opengl - GLSL EndPrimitive() が三角形のストリップを壊す

Mavericks を実行している Intel HD 4000 グラフィックスを搭載した Macbook Pro でジオメトリ シェーダーを試しています。EndPrimitive()通話中に奇妙な動作に気付きました。ここに私のジオメトリシェーダーがあります:

プログラムはglfw、OpenGL 3.2 コア コンテキストを使用および要求します。で 1 つの頂点のみを描画し[0, 0]ます。私の目標は、最終的にジオメトリ シェーダーが複数の三角形ストリップで構成される正方形のグリッドを出力するようにすることです。シェーダーはそのままで、グリッドの 1 行を出力します。結果は次のとおりです。

明らかに正しい出力

その時点で、現在のトライアングル ストリップ プリミティブを終了し、次の行のために新しいプリミティブを開始したいと考えています。EndPrimitive()ただし、上記のシェーダーで呼び出しのコメントを外すだけで、結果が台無しになります。

壊れた出力

について何か誤解していEndPrimitive()ますか? 私の理解では、現在のトライアングル ストリップを終了し、新しいトライアングル ストリップを開始する必要があります。ループの後は何もしていないので、シェーダーの結果はループのEndPrimitive()有無にかかわらず同じになるはずです。

また、今は別の実装でテストすることはできません。私の実装にバグがあるのでしょうか? この問題を特定するためにできることはありますか?

0 投票する
2 に答える
1485 参照

opengl - GLSL のライン ストリップに沿ったスクリーン空間距離

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

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

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

0 投票する
0 に答える
333 参照

opengl - GLSL ジオメトリ シェーダーにライン入力を提供する方法は?

ジオメトリ シェーダーで使用layout(points) inする場合、gl_Position にvec4:

そしてgl_in[0].gl_Position、ジオメトリシェーダーでアクセスできます。

しかし、代わりに を使用してジオメトリ シェーダーに入力を取りたい場合はどうすればよいlayout(lines) inでしょうか? 頂点シェーダーを介して値を転送することでこれを行うことができますか、それとも別の方法がありますか?

要するに:gl_in[0].gl_Positionおよびを使用してアクセスできるように、ジオメトリ シェーダーにライン データを提供するにはどうすればよいでしょうgl_in[1].gl_Positionか?

0 投票する
1 に答える
8720 参照

opengl - ジオメトリ シェーダーでライン ストリップの隣接関係を使用する

そのため、ジオメトリ シェーダーを使用してライン ストリップ隣接プリミティブから円柱を描画しようとしましたが、4 つの頂点で機能しますが、より長いライン ストリップに適用できるようにしたいと考えています。問題は、4 番目の頂点の後で完全に台無しになることです。プリミティブがシェーダーに隣接情報へのアクセスを提供することは知っていますが、アクセス方法がわからないので、私の質問は次のとおりです。

隣接情報をどのように使用しますか? そして、同じ描画呼び出しで複数の行に対してこれを行うことは可能でしょうか?

疑似コードの例を提供していただければ幸いです。

0 投票する
1 に答える
515 参照

c++ - C++、OpenGL - ジオメトリ シェーダー

OpenGL のジオメトリ シェーダー - C++ プログラミングで立ち往生しています。1つの回転した壁を描くことを6回繰り返して単純な立方体を作りたいです。これが私の頂点シェーダーです (すべてのプリアンブルに #version 330 コアがあります):

現在のジオメトリ シェーダー:

そして今、フラグメントシェーダー:

うーん、がらくたがいくつかあります。キューブにシェーディングも入れたかったのですが、座標の送信に問題があります。主な問題は、ここで (MVP マトリックスによって) スケーリングされた正方形を取得し、基本的なインターフェイス (ROT マトリックス) で回転させることもできますが、「+offset」行のコメントを外すと混乱します。きれいな 6 回繰り返しを作成するにはどうすればよいですか?