問題タブ [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 に答える
2196 参照

opengl - テッセレーション後にジオメトリ シェーダーで頂点法線を計算する

テッセレーション コントロールと評価シェーダーを正常に機能させることに成功しましたが、頂点ごとではなく (三角形) 面の法線を計算しているため、シーンのライティングはまだブロック状です。テッセレーションを使用するようになったので、tess eval またはジオメトリ シェーダーのいずれかで、新しくテッセレーションされた頂点の新しい法線頂点を計算する必要があるようです。

頂点ごとの法線を滑らかにするために、問題の頂点を共有するすべての三角形の面ごとの法線を計算し、これらの面法線の加重平均を計算する必要があります。しかし、tess eval またはジオメトリ シェーダーですべての三角形の面を取得する方法がわかりません。ジオメトリ シェーダーのlayout (triangles_adjacency) inオプションは有望に見えますが、その使用方法に関する情報はあまりありません。

この方法で法線/バンプ マップを使用せずに、GPU で頂点法線ごとにスムーズに計算することは可能ですか? 最終的な目標は、テッセレーションの詳細レベルの向上から恩恵を受ける、スムーズな頂点ライティングを実現することです。

これが私のテッセレーション コントロールと評価シェーダーです。

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

directx - ジオメトリ シェーダーを使用したビルボード

ポイントを入力として受け取り、三角形のストリームを出力するジオメトリ シェーダーを使用してビルボードをレンダリングしようとしています (DirectX11 を使用)。しかし、現在の結果は私が期待するものではありません。

比較のために、ここに 2 つのスクリーンショットを示します。まったく同じセットのパーティクルをレンダリングし、同じ方向 (多かれ少なかれ、カメラを ~90° 回転させる必要がありました) と距離から見たものです。ポイントとしてレンダリングしたものと、ビルボードでレンダリングしたものですシェーダー:

ビルボード シェーダーでレンダリングされたパーティクル ポイントとしてレンダリングされたパーティクル

2 番目の画像でわかるように、ポイントとしてレンダリングすると、パーティクルが中心から離れて移動し、ほぼ画面全体をカバーしていることがはっきりとわかりますが、ビルボード シェーダーでレンダリングすると、スケールがわずかに変化しますが、常に静止している。

残念ながら、何がこれを引き起こしているのかについての手がかりはありません。私はthisなどのチュートリアルに従ってきました.これは、マトリックスがどのように設定されることになっているのかを説明していますが、結果は私の期待または実装が間違っていることを示しています.

以下は、ビルボード シェーダーのコードです。このシェーダーは、マトリックスを構築してパーティクルの方向を記述し、ビルボードの 2 つの三角形を放出します。

参考までに、パーティクルを単純なポイントとしてレンダリングするためのシェーダー コードを次に示します。

私が気付いたもう 1 つの奇妙な点は、少なくとも常にではなく、私のビルボードがカメラの方を向いていないことです。ただし、マトリックスをセットアップする方法からすると、そうなると思います。代わりに、2 つの反対方向から見た場合にのみカメラの方を向き、カメラを回転させ始めるとすぐに幅が狭くなります。

これにより、マトリックスの作成を間違えたと思いましたが、それを見つけることができません。

うまくいけば、あなたたちは私が問題を見つけるのを手伝ってくれるでしょう. よろしくお願いします。

編集

この問題の解決策を見つけたようですが、なぜこれが解決策なのかわかりません。奇妙な理由で、localToWorld マトリックスに ViewProjection マトリックスを掛けることができません。代わりに、次のように 2 つのステップに分ける必要があります。

これが事実である理由がわかりません。おそらく、デフォルトの column_major の代わりに row_major マトリックスを使用することに関連しています。しかし、現状では、この動作は私にはまったく意味がありません。行列の乗算は連想的でなければならないため、上記のスニペットは元のコードと同じ結果になるはずですが、明らかにそうではありません。ここで何が起こっているのか、いくつかの光を当てることができる人もいるかもしれません。

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

opengl - GLSL ジオメトリ値が変更されるべきではない場合に変更される

ポイントの配列をプログラム可能なパイプラインに渡して立方体を描画する非常に単純なプログラムを使用しています。フレームごとに(外部入力に基づいて)ジオメトリを変更できるように設定しようとしています。そのため、照明については、変更後に顔の法線を再計算する必要があります。演習としてジオメトリ シェーダーで実行しています。

私のシェーダーは次のとおりです。

バーテックス:

ジオメトリ:

断片:

私は法線を計算しようとしていましたが (デバッグの理由でそのコードを取り出しました)、プログラムを実行したときに法線値がおかしくなりました。そこで、フラグメントの色を通常の値に設定しました。(それが実際に法線であったかどうかを確認するためです。) したがって、何らかの理由で、'normal' の値は赤、緑、白、黒の間で反転していますが、理由はわかりません。フラグメント シェーダーで単純にカラー ベクターを指定すると、立方体はどこでもそのカラーで適切にレンダリングされます。

通常の値がまったく変化するのはなぜですか?

考え?

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

opengl - カメラの位置/回転に応じて変化するフラグメント拡散値

単純な拡散照明を GLSL で動作させようとしています。ポイントの配列として渡される立方体があり、ジオメトリ シェーダー内で面の法線を計算しています (実行時にメッシュを変形するつもりなので、新しい面の法線が必要になるためです)。

私の問題は、カメラを世界中に移動すると拡散値が変化することです。カメラが動くと、キューブの面のシェーディングが変化します。これを引き起こしている何が欠けているのかを理解できませんでした。私のシェーダーは次のとおりです。

バーテックス:

ジオメトリ:

断片:

ありがとう

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

opengl - テッセレーションを使用して穴のあるクワッドを三角形化する

テッセレーション シェーダーを使用して、穴のあるクワッドを三角測量することはできますか? 例えば、

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

  1. クワッドがあると想像してください。
  2. 次に、クワッドの中心に穴を開けたいと思います。
  3. その穴を作るには、さらに多くの頂点が必要です。

そして質問:

  • テッセレーションシェーダーを使用してそれを行うことはできますか? もしそうなら、どのように?
  • 代わりにジオメトリシェーダーを使用する必要がありますか?
0 投票する
1 に答える
392 参照

opengl - 変換フィードバックを伴う glBindBufferRange の使用

連続する変換フィードバックを埋めたいバッファーがあり、これをどのように正確に行うのか疑問に思っています。

glBindBufferRangeには 5 つの引数があります。最初の 3 つが の引数と同等であることは理解していますが、との引数glBindBufferBaseについていくつか質問があります。offsetsize

最初のトランスフォーム フィードバックがnから取得したプリミティブを生成した場合GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN、プリミティブはポイントであり、バッファ内のその位置から続行したい場合、 のオフセットをglBindBufferRangeに設定する必要がありn*4*sizeof(GLfloat)ますか? (vec4 ジオメトリ シェーダー出力を取得していると仮定します)

ドキュメントには、基本的なマシン単位である必要があるoffsetと書かれsizeていますが(GLintptrとGLsizeiptrの2つの異なるタイプがありますが)、それが何を意味するのか正確にはわかりません。

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

glsl - ジオメトリ シェーダ(GLSL)を使用して頂点を生成する

最近、つるをリアルタイムで生成するアルゴリズムを実装しようとしています。CPUで行う方法はちょっと知っていますが、GPUを使用してこれを実現したいと考えています。私はジオメトリ シェーダーを考えていましたが、ジオメトリ シェーダーはプリミティブ スケールで実行されるように見えます。つまり、すべてのプリミティブでまったく同じ機能を実行するということですが、これは私が期待するものではありません。

これは、私のツル成長アルゴリズムがどのように機能するかを概念的に示しています。オブジェクト メッシュ上の任意のポイントをルート ポイントとして選択すると、ツル成長アルゴリズムは、生成された以前のポイントに従って一連のポイント (ツルを表す) を生成します。ポイントの位置は、重力、接着力、三角形の面までの距離などの要因の影響を受けます。すべてのポイントは、三角形の面の法線と同じ側にある必要があります。

GPUでこれを行うにはどうすればよいですか? どうもありがとう。

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

opengl - GLSL バージョン 150 で EmitVertex を使用すると値が無効になる

この glsl シェーダーは正常にコンパイルされますが、glUseProgram(); でアクティブにしようとすると、opengl で無効な値のエラーが表示されます。

ただし、頂点を放出する部分を削除すると機能します。私は何を間違っていますか?