問題タブ [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.
directx - ジオメトリ シェーダーが原点で追加のポイントを受け取る
ジオメトリ シェーダーの使用に関して非常に奇妙な問題があります。ポイントを取得して三角形に変換する非常に単純なジオメトリ シェーダーを作成しました。
ここにシェーダーがあります:
次のように 4 つの頂点を送信します。
そして、私はこの出力を取得します:
ご覧のとおり、入力アセンブラーに送信した三角形は 4 つだけで、5 つが出力されています。
なぜこれが起こるのかについてのアイデアはありますか?バッファによって割り当てられている余分なメモリに関連している可能性があるのではないかと心配しています...しかし、問題がどこにあるのか正確にはわかりません。
前もって感謝します!
glsl - lines_adjacencyを使用したGLSLジオメトリシェーダー
GLSLジオメトリシェーダーを作成していて、lines_adjacency
入力レイアウトを使用しようとしていますが、機能していません。入力レイアウトを使用した最初のパススルーテストは正常にlines
機能します。
しかし、lines_adjacency
入力に切り替えると何も描画されません。
ここでは実際には隣接ポイントを使用していないことはわかっていますが、最終的には隣接ポイントが必要になります。私はGLSLの初心者なので、助けていただければ幸いです。
opengl - Opengl ジオメトリ シェーダの整数テクスチャ フェッチが失敗する
GeForce 330m で実行されているジオメトリ シェーダーから整数テクスチャをサンプリングしようとしています。テクスチャにロードする以外の値を返すようです。テクスチャの作成と読み込みに (基本的に) このコードを使用します。
アイデアは、特定の 1 つのピクセルが 400 の w 値を持つように設定されているということです。次に、これをジオメトリ シェーダーで使用します。
コメントアウトされた、等しいはずの固定値を使用すると、何かが放出されます (IE、1 ポイント)。実際のテクセル フェッチを使用すると、何も返されません。私が知っている影響を与える可能性のある値はすべてハードコーディングされているため、これが機能しない理由がわかりません。これは完全なコードではありません (OO のセットアップ、かなりの量を調べる必要があります) が、これらは該当するデータを含む関連する OpenGL 呼び出しです。
c++ - HLSLジオメトリシェーダークワッドが移動しています
HLSLのジオメトリシェーダーを使用して、単一のポイントをクワッドに変換しようとしています。ジオメトリシェーダーを使用しておらず、単一のピクセルを表示しようとすると、問題なく機能します。しかし、私がそれを使用すると、クワッドは描画されますが、100フレーム更新などごとに別の場所に移動するようです。
これが私のスプライトクラスです(私のコードについては完全にはわかりません。特に頂点バッファーと描画呼び出し):
そして、これが私のシェーダーです:
ご覧のとおり、私はカメラの上下のベクトルを使用して、四頭筋の画面を揃えています。ここで私は自分のコードについてかなり確信が持てません(これはこれを行う正しい方法ですか?)vertex [0] .Radは、クワッドのサイズを定義するための半径またはスケールです。
助けてくれてありがとう-ありがとう
opengl - フレームごとのジオメトリの変更:OpenCLまたはGLSLジオメトリシェーダー?
水面を構築しています。ここでは、波の効果を得るために正弦波の頂点をシフトしたいと考えています。OpenGLを選択する前の私の理解は、これはジオメトリシェーダーで行うのが最適であるということでした。
ただし、現在、私はOpenGL2.1のOpenGLES 2.0サブセットを使用しており、最新のプログラム可能なパイプラインを厳密に利用しています。このバージョンでは、ジオメトリシェーダーは使用できません。
私には3つの選択肢があります:
- CPUですべての頂点の変更を行い、すべての水面のフレームごとにVBOをアップロードして、OpenGL2のみを使用します。
- OpenGL 3.2に移動し、これにジオメトリシェーダーを使用します。
- OpenGL 2をOpenCLと一緒に使用して頂点の変更を行い、OpenCLはコンテキストとしてGPUを使用してボトルネックを減らします。
主に物事をシンプルにしたいと思います。それで、私がOpenCLを(まだ)知らないことを考えると、おそらく私はCPUに大きなバッチを送ることに固執するべきですか?
opengl - glDrawArraysがGL_INVALID_OPERATIONエラーを生成する原因は何ですか?
私は、OpenGLとGLSLを使用して、GPU Gems3の最初の章で詳しく説明したものと同様のマーチングキューブアルゴリズムの2パスGPU実装を作成しようとしています。ただし、glDrawArrays
最初のパスでのへの呼び出しは、一貫して。で失敗しますGL_INVALID_OPERATION
。
私は見つけることができるすべてのドキュメントを調べて、glDrawArrays
そのエラーをスローする可能性があるこれらの条件を見つけました:
GL_INVALID_OPERATION
ゼロ以外のバッファオブジェクト名が有効な配列またはGL_DRAW_INDIRECT_BUFFER
バインディングにバインドされており、バッファオブジェクトのデータストアが現在マップされている場合に生成されます。GL_INVALID_OPERATION
の実行と対応するglDrawArrays
の実行の間に実行された場合に生成されます。glBegin
glEnd
GL_INVALID_OPERATION
現在のプログラムオブジェクト内の2つのアクティブなサンプラーが異なるタイプであるglDrawArrays
かどうかによって生成されますが、同じテクスチャ画像ユニットを参照します。glDrawElements
GL_INVALID_OPERATION
ジオメトリシェーダーがアクティブで、モードが現在インストールされているプログラムオブジェクトのジオメトリシェーダーの入力プリミティブタイプと互換性がない場合に生成されます。GL_INVALID_OPERATION
モードがGL_PATCHES
あり、テッセレーション制御シェーダーがアクティブでない場合に生成されます。GL_INVALID_OPERATION
プリミティブの頂点を変換フィードバックの目的で使用されているバッファオブジェクトに記録すると、バッファオブジェクトのサイズの制限を超えるか、で設定されている終了位置オフセット+サイズ-1を超える場合に生成されglBindBufferRange
ます。GL_INVALID_OPERATION
glDrawArrays()
ジオメトリシェーダーが存在せず、変換フィードバックがアクティブであり、モードが許可されたモードの1つではない場合に生成されます。GL_INVALID_OPERATION
glDrawArrays()
は、ジオメトリシェーダーが存在し、変換フィードバックがアクティブであり、ジオメトリシェーダーの出力プリミティブタイプが変換フィードバックprimitiveModeと一致しない場合に生成されます。GL_INVALID_OPERATION
バインドされたシェーダープログラムが無効な場合に生成されます。- 編集10/10/12:
GL_INVALID_OPERATION
変換フィードバックが使用されている場合に生成され、変換フィードバックバインディングポイントにバインドされたバッファーも配列バッファーバインディングポイントにバインドされます。これは、私がバインドしたバッファーのタイプミスが原因で発生していた問題です。仕様にはこれは違法であると記載されていますが、私が見つけたドキュメントでは、エラーをスローする理由の1つとしてglDrawArraysの下にリストされていません。
残念ながら、私が見つけることができる公式のドキュメントの1つは、これらのうち3つ以上をカバーしていません。私はこのリストを多くの情報源から収集しなければなりませんでした。ポイント7と8は、実際にはのドキュメントに基づいてglBeginTransformFeedback
おり、ポイント9はまったくドキュメント化されていないようです。どこかのフォーラム投稿で言及されているのを見つけました。しかし、私が得ているエラーを説明しているようには見えないので、このリストはまだ完全ではないと思います。
- 私は自分のプログラムのどこにも、バッファをまったくマッピングしていません。
- 私はコアプロファイルを使用しているので
glBegin
、glEnd
利用できません。 - 私は2つのサンプラーを持っていて、それらは異なるタイプですが、それらは間違いなく異なるテクスチャーにマッピングされています。
- ジオメトリシェーダーはアクティブですが、その入力レイアウトは
layout (points) in
であり、glDrawArrays
で呼び出されていGL_POINTS
ます。 - 私は
GL_PATCHES
いかなる種類のテッセレーションシェーダーも使用していません。 - ジオメトリシェーダーが出力できる最大のスペースを割り当てていることを確認しました。それから私はそれを4倍にしてみました。助けにはならなかった。
- ジオメトリシェーダーがあります。次のポイントを参照してください。
- 変換フィードバックが使用されており、ジオメトリシェーダーがありますが、出力レイアウトは
layout (points) out
でglBeginTransformFeedback
呼び出されGL_POINTS
ます。 glValidateProgram
の呼び出しの直前にへの呼び出しを挿入しようとしましたglDrawArrays
が、が返されGL_TRUE
ました。
実際のOpenGLコードは次のとおりです。
実際のエラーは、の呼び出しglDrawArrays
ですRenderPass1
。とへの呼び出しをコメントアウトするglBeginTransformFeedback
とglEndTransformFeedback
、glDrawArrays
エラーの生成が停止することに注意してください。ですから、何が悪いのかは、おそらく何らかの形で変換フィードバックに関連しています。
8/18 / 12、午後9時を編集:
gDEBuggerでNVIDIAGLExpert機能を見つけましたが、これは以前はなじみがありませんでした。これをオンにするとGL_INVALID_OPERATION
、特に、に関するより実質的な情報が得られましたThe current operation is illegal in the current state: Buffer is mapped.
。だから私は上記のポイント1にぶつかっています。どうすればいいのかわかりませんが。
glMapBuffer
コードのどこにも、、または関連する関数の呼び出しはありません。、、、、およびへglMapBuffer
の呼び出しで中断するようにgDEBuggerを設定しましたが、どこでも中断しませんでした。次に、最初にコードを追加して、煩わしいバッファを明示的にマップ解除しました。エラーが消えなかっただけでなく、両方を呼び出すとが生成されます。それで、私が使用しているバッファのどちらもマップされていない場合、エラーはどこから来ていますか?glMapBufferARB
glMapBufferRange
glUnmapBuffer
glUnmapBufferARB
RenderPass1
glUnmapBuffer
The current operation is illegal in the current state: Buffer is unbound or is already unmapped.
8/19 / 12、午前12時に編集:
gDEBuggerのGLExpertから表示されるエラーメッセージに基づくと、呼び出しによってglBeginTransformFeedback
、バインドされたバッファGL_TRANSFORM_FEEDBACK_BUFFER
がマップされるようになっているようです。具体的には、「テクスチャ、バッファ、画像ビューア」でバッファをクリックすると、メッセージが出力されますThe current operation is illegal in the current state: Buffer must be bound and not mapped.
。ただし、これをとの間に追加するglBeginTransformFeedback
とglEndTransformFeedback
:
0を出力します。これは、GL_TRANSFORM_FEEDBACK_BUFFER
マップされていないことを示します。このバッファが別のバインディングポイントにマップされている場合でも、これは0を返しますか?なぜglBeginTransformFeedback
バッファをマップして、変換フィードバックに使用できないようにするのでしょうか。
ここで学べば学ぶほど、混乱していきます。
10/10/12を編集:
以下のNicolBolasの解決策への返信に示されているように、私は問題を見つけました。それは彼が見つけたものと同じです。愚かなタイプミスのため、同じバッファーを入力と出力の両方のバインドポイントにバインドしていました。
質問を投稿してからおそらく2週間後に見つかりました。私はしばらくの間欲求不満をあきらめ、最終的に戻ってきて、基本的にすべてを最初から再実装し、古い、機能していないものを定期的に比較しました。私が終わったとき、新しいバージョンは機能しました、そして私が間違ったバッファをバインドしていたことを発見したのは違いを調べたときでした。
opengl - ジオメトリ シェーダーでトライアングル ストリップの代わりにトライアングルをエクスポートできますか?
ジオメトリ シェーダーからトライアングル ストリップの代わりにトライアングルのみをエクスポートする可能性はありますか? これにより、いくつかの興味深い可能性が可能になります。OpenGL 3.3。
シェーダの出力モードを指定します。そして、私が試してみると:
コンパイルして正常に動作しますが、三角形のストリップと同じように現れます。
また、GLSL 言語仕様 3.3:
ジオメトリ シェーダー出力のレイアウト修飾子識別子は次のとおりです。
- レイアウト修飾子 ID
- ポイント
- line_strip
- 三角形ストリップ
- max_vertices = 整数定数
ここには「三角形」はないようです。
directx-11 - DirectX11 のジオメトリ シェーダーでインスタンス化するにはどうすればよいですか?
頂点シェーダーでは、次のようにすることを知っています。
ジオメトリ シェーダで instancedPosition を使用するのと同じことは何ですか?たとえば、1 つの頂点で構成されるモデルをインスタンス化し、各インスタンスに対してジオメトリ シェーダでクワッドを作成し、クワッドの位置を対応するインスタンスの位置に設定します。インスタンス バッファ内のインスタンス。
cg - CgFX ジオメトリ シェーダー
CgFX でジオメトリ シェーダーを使用するには? 実際に「テクニック」内でジオメトリシェーダーを指定する方法は?
リストは以下のとおりです。頂点シェーダーとフラグメント シェーダーは適切にコンパイルされています。しかし、「NVIDIA FX Composer 2.5」は、に追加した'error C3001 no program defined'
後に を起動します。'GeometryProgram'
'technique'