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

opengl - 計算シェーダ: テクスチャの初期化でエラーが発生しました

計算シェーダーに 7 つのスライスを持つ image2DArray があります。関数 imageStore を使用して問題なく書き込むことができ、これらのテクスチャも表示できます。

私の問題は初期化に伴います。テクスチャを初期化しようとしましたが、できません。実際、初期化のためにループを作成します。

N = 7 の場合は何も表示されませんが、N < 7 の場合はすべて正常に機能し、テクスチャが初期化されます。

image2DArray を正しく初期化できない理由を誰かが説明してくれますか?

編集:私がテストして確認したこと:テクスチャのすべてのスライスに書き込んで表示してみてください。正常に動作しますが、テクスチャを初期化しないと、前のフレームのデータが残ります。したがって、スライスのすべてのピクセルを 0 に初期化しますが、N=7 の場合は何も表示されません。

いくつかのコード:

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

c++ - 計算シェーダーとフラグメント シェーダーでのテクスチャの使用

テクスチャを使用して、データが計算される計算シェーダーとそれが使用されるフラグメント シェーダーの間で渡されるデータを格納しようとしています。

テクスチャを作成し、次を使用して空の値で塗りつぶします。

次に、以下を使用して計算シェーダーで使用できるようにします。

この関数の仕様は次のとおりです。正しい引数を使用していることを確認できます: https://www.opengl.org/sdk/docs/man/html/glBindImageTexture.xhtml

次に、計算シェーダー内で、次を使用してテクスチャを取得します。

次に、テクスチャの値の 1 つをテストとして設定します。

その vec4 をテクスチャの位置 (0,0) に配置する必要があります。

次に、フラグメント シェーダーが属するプログラムのユニフォームとしてテクスチャを追加します。

次に、フラグメント シェーダーでテクスチャを取得します。

そして、テクスチャの位置 (0,0) の値として何かの色を設定しようとします。

ただし、結果として、黒(0.0、0.0、0.0、1.0)になります。計算シェーダーで設定した内容に関係なく、常にこれを取得します。

私はおそらく本当に明白な何かを見逃しているので、私が欠けているものを示すコードのビットは素晴らしいでしょう

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

opengl - Fragment Shader で GL_TEXTURE_3D をサンプリングする

サイズが 16x16x6 の GL_TEXTURE_3D があり、計算シェーダーにフロートが設定されており、フラグメント シェーダーでそれをサンプリングしようとしています。

フラグメント シェーダーで使用できるようにするために、描画呼び出しの直前に次のコードを用意しました。

次に、フラグメント シェーダー自体で次のようにします。

次に、テクスチャが正しく通過したことをテストします。

これに基づいて、すべてのテクセル値が(0.0,0.0,0.0,1.0)

これがなぜなのか理解できませんか?計算シェーダーで設定した値に基づいて(0,0,0)値を調整(16.0,0.0,0.0,0.0)することを期待します(16.0,16.0,16.0,16.0)

PS 値がテクスチャに正しく書き込まれていることは注目に値するかもしれませんglGetTexImage()

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

c++ - 計算シェーダーでのアトミック操作のパフォーマンスへの影響は?

256x256 テクスチャのテクセルを変更する計算シェーダーがあります。

計算シェーダーには 256x256x256 の呼び出しがあり、呼び出しの x および y コンポーネントがテクセルの u および v 座標に直接マップされます。したがって、各テクセルは 256 回書き込むことができます。

計算シェーダーを呼び出すたびに、指定されたテクセルの現在の内容を確認し、いくつかのテストを実行して、上書きするかどうかを決定します。ただし、他の呼び出しが書き込まれる前にテクセル値を取得するという同時実行の問題を回避するために、アトミック操作を使用してテクスチャに値を書き込むことを検討しています。

ただし、アトミック操作は他のすべてをそれが終了するまで待機させるため、これは操作を並列化するポイントを無効にすることを私は知らされました。アトミックにテクスチャに書き込みます。

その場合、これはパフォーマンスにどの程度影響しますか? z 呼び出しは変更される可能性があり、256 をはるかに超える可能性があることに注意してください。

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

opengl - コンピューティング シェーダーはデータの一部のみを更新します

すべてのパーティクルをレンダリングするプログラムに行き詰まっていますが、3 で 1 つのパーティクルしか更新していません。これをテストするために行ったことは次のとおりです。10 個のパーティクルで vbo を作成し、それらをすべて垂直に配置し、コンピューティング シェーダーを設定して、更新ごとに x 位置を変更します (pos.x+=0.1)。約 1 ~ 2 秒後の結果を次に示します (画像は 1:5 スケールです)。

例

local_size_x = 1、local_size_y = 1、local_size_z = 1 を使用してから、 DispatchCompute(10,1,1) を使用します。呼び出しIDに何か問題がありますか?

アップデート

パディングを追加してシェーダーの構造体定義をいじってみると、更新ごとに 1 つのデータだけがスキップされました。これはパディングの問題であることを意味しますが、適切にパディングする方法についての適切な説明が見つかりません。また、パディングしないことは可能ですか?この無駄な余分なデータがすべて必要ない場合はどうすればよいですか?

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

opengl - OpenGL - シェーダー ストレージ バッファー オブジェクトを画面に描画する

私のコンピュータ シェーダでは、SBBO に ARGB 値を入力しています。(ただし、これを RGBA に簡単に変更できます)。しかし今、私はいっぱいにしたバッファを画面に描画したいと思います。

これを行う最善の方法は何ですか?例を挙げていただけますか?

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

opengl - Compute Shader のテクスチャへの書き込み

投影されたテクスチャを 3D オブジェクトのより大きなテクスチャにコピーする CPU コードを実装しましたが、必要に応じて「デカール ベイク」を行いましたが、GPU に実装する必要があります。これを行うには、現在のセットアップで FBO を追加するのが非常に難しいため、コンピューティング シェーダーを使用したいと考えています。

現在の実装のサンプル画像

この質問は、コンピュート シェーダーの使用方法に関するものですが、興味のある人にとっては、アイデアはユーザー jozxyqk から得た回答に基づいています

書き込み先のテクスチャは と呼ばれる私のコードにあります_textureが、投影されたものは_textureProj

シンプルな計算シェーダー

ご覧のとおり、現在、テクスチャを任意の (青) 色に更新したいだけです。

更新機能

問題updateTex()メインプログラムオブジェクトの外側を 呼び出すと、効果はありませんが、スコープ内で呼び出すと、次のようになります

次に、レンダリングすると、次のように表示されます。

質問: メイン プログラム オブジェクト スコープ内で update メソッドを設定することは適切な方法ではありませんが、視覚的な結果を得る唯一の方法であることは認識しています。何が起こるかは、フラグメントシェーダーをほとんど排除し、スクリーンスペースに描画することだと私には思えます...

これを適切に機能させるにはどうすればよいですか? (私の主な焦点は、テクスチャに何かを書き込んで更新できるようにすることです)

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