問題タブ [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 投票する
1 に答える
2243 参照

directx - DirectX 11 Compute Shader に Texture2D データをロードする

DirectX11 計算シェーダーで texture2d からデータを読み込もうとしていますが、テクスチャ オブジェクトが同じ浮動小数点数で満たされていても、texture2D オブジェクトの「Load」関数は 0 を返し続けます。

これは、DXGI_FORMAT_R32G32B32A32_FLOAT を使用した 160 * 120 の texture2d です。次のコードは、このリソースの作成方法です。

そして、次のように X = Y = 2 および Z = 1 でディスパッチを実行しようとします。

そして、非常に単純な CS シェーダーを作成して、texture2d 内のデータを取得し、それからデータを取得しようとしました。したがって、計算シェーダーは次のようになります。

CPU 側で CS シェーダーの結果を出力する方法は正しいと思います。

UAV にバインドするバッファーには 4 つの要素しかありません。したがって、texture2d のすべての浮動小数点数が 0.7 の場合、0.0 ではなく 4 つの 0.7 が CopyToCPUBuffer 関数で出力されるはずです。

私のコードで何が間違っているのか知っている人はいますか、または計算シェーダーで DirectX 11 texture2d のデータを正しく読み取る方法を示す完全な例またはチュートリアルを誰かが提供してくれますか?

前もって感謝します。

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

android - Android 5.1.1 (Opengl 3.1) のコンピューティング シェーダーでスタックする

計算シェーダーから値を取得し、それを画面に直接レンダリングする非常に単純なプログラムを作成しました。

必要な計算シェーダー メソッドをすべて呼び出した後、シェーダー ストレージ バッファーが vbo にバインドされていないのではないかと疑っています。

コードを共有しています。エラーがあるかどうかを確認してください。私が取得しているコンパイルエラーはなく、さらに私が使用しているデバイスは、私がチェックした gl 3.1 もサポートしています。

また、これらすべてに加えて、マニフェストで何か言及する必要がありますか?

これは私のレンダラーコードです

これは私の計算シェーダーです (hellocompute)

これは私の頂点シェーダーです

これは私のフラグメントシェーダーです

x = 0.2、0.4、0.6、0.8、1.0 に黄色い点が表示されるはずです

ただし、属性 a_Position にデフォルトのゼロ値が使用されているため、x=0 にはドットが 1 つしか表示されません。

ディスパッチ呼び出し後に vbo にバインドするときに、新しい値が反映されるはずです。

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

opengl - OpenGL コンピュート シェーダーに時間制限はありますか?

OpenGL Compute Shaders を使用してデータの計算を行っています。1 つのシェーダーを 10 秒以上実行できないことを除けば、すべて正常に動作します。glBeginQuery(...)とで時間を計りglEndQuery(...)ます。シェーダーは 1 ミリ秒から 10 秒で正常に実行されます。シェーダーが必要とする時間を増やすために、シェーダーを呼び出さずにデータを追加するだけです。しかし、シェーダーが 10 秒以上必要な場合、データを追加することはできません。その後、プログラムがフリーズし、それ以上何もできなくなります。私が測定した最高​​値は 11.02 秒でした。

では、コンピューティング シェーダーの時間境界はありますか? それとも、私が間違っていた明らかな何かがありますか?

追加情報:Nvidia GT 555Mを搭載したノートブックで作業しています。私は bumblebee を使用し、QtCreator を起動optirunして Nvidia カードで実行します。私を助けるためにさらに情報が必要な場合は、お尋ねください. それに答えるために何が必要なのか、私にはわかりません。

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

unity3d - #pragma kernal Main の構文エラー

次のシェーダーがあります。

団結して。ただし、これにより、「シェーダーエラー ":Parse error: syntax error at line 1" // つまり、 #pragma kernal Main

私は周りを見回しましたが、 #pragma kernal [メイン関数の名前] は正しい構文のようですが、何が間違っていますか?

これは unity 5.0.1 32 ビット版です。

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

opengl - 計算シェーダーでテクスチャ サンプラーよりも Image Load/Store を使用する利点は何ですか?

画像のロード/ストアの利点がわかりません。

グローバルイルミネーションを計算するかなり複雑な計算シェーダーがあります。テクスチャ ベースとイメージ ベースの両方のバリアントを同等に実装しました。画像を使用するとパフォーマンスが低下します。

また、おそらく AMD でのみ、同じシェーダーでテクスチャーの読み取りと書き込みを行うことはできません。なぜそれが不可能なのかわかりませんが、画像を使用する利点は何ですか?

画像のロード/ストア バリアントのシェーダー ソース: https://gist.github.com/achlubek/c96a7f6f4271c5978ef2

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

c++ - 計算シェーダーで 2 つの SSBO を使用すると、imageStore が書き込みを行わない

ATI HD 5770 で計算シェーダーを実行しようとしたときに、計算シェーダーの 1 つにエラーがあることに気付きました。GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS が 8 であるにもかかわらず、シェーダーで複数の SSB にアクセスすると問題が発生することがわかりました。

いくつかいじった後、問題のあるシェーダーをこの MWE に減らしました。

このシェーダをそのまま実行すると、 からの変更は見られませんimageStore。を削除すると、画像b.length();に目的の出力が得られます-2

どちらの場合もの値a[0]が に変更される-2ため、シェーダーは確実に実行されています。

どちらの場合も、シェーダーのコンパイル/リンカー エラーglGetErrorはなく、エラーも返されません。

ここで何か間違ったことをしていますか?

これは (ドライバーの) バグですか? 結局のところ、これは私の他の (NVidia) カードでは発生しません。

完全を期すために、この「最小限の」C++ ファイルを使用してシェーダーを実行しました。

アップデート

imageLoad2 つ以上の SSBO が使用されている場合は常に 0 を返し、2 個の SSBO が使用されている場合は 3 を返し、2 個未満の SSBO の場合は正しい値を返すという同様の問題があるようです。どちらの問題も、最新のドライバー (15.7、以前は 15.5) でも発生します。

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

directx - シェーダー、バッファー、またはテクスチャーを計算する

計算シェーダーを使用して流体力学を実装しようとしています。この記事では、コンピューティング シェーダーの前に作成されたテクスチャに対して一連のパスが実行されています。

テクスチャまたはバッファで各パスを実行する方が高速ですか? いずれにせよ、最終パスはテクスチャに適用する必要があります。

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

algorithm - 動的に一様な方法で Revelles アルゴリズムを使用して octree をトラバースする GLSL

GLSL (v450) のコンピューティング シェーダーで、リアルタイムのレイ マーチングを使用するレベル アルゴリズムを使用して、octree をトラバースしようとしています。私はなんとかそれを横断し、画像を取得しましたが、私の fps は非常に低く、約 0 ~ 5 fps です。アルゴリズムの疑似コードは再帰的なものなので、スタックを使用してループに変換しました (GLSL では再帰が許可されていないため)。問題は、このループを動的に均一にしないとすぐに、約 30 ~ 40 のこの巨大な fps 低下が発生することです。

スタックで共有属性を使用すると、この fps を元に戻すことができます。これは、グローバル変数の計算シェーダーでのみ使用できます。

ワークグループ内のすべてのスレッド間で共有および使用できるようにします。問題は、ループを動的に均一にする必要があるように見えるため、これらをbarrier()および/またはmemoryBarrierShared()関数と同期できないことです (共有変数の下を参照してください www.opengl.org/wiki/Compute_Shader)。同期できないため、画像がピクセル化されてちらつきます。

このアルゴリズムを動的に均一なループに変換する方法はありますか? ループが動的に均一でなくなると fps が低下するのはなぜですか?

以下は、メインループの私のコードです。