問題タブ [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.
c++ - Tiled rendering compute shader light culling and shading
I'm trying to implement tiled-deferred rendering in OpenGL/GLSL and I'm stuck on light culling.
My GPU is kind of older (AMD Radeon 6490m) and for strange reasons compute shaders runs in infinite cycle when atomic operations are called inside them on shared variables so I couldn't compute minimum and maximum depth using compute shaders. Anyway, it isn't much time-consuming operation so I do it in fragment shader.
Then for every visible point light (in view space) I compute screen space bounding quad. Now I want to use single compute shader for light culling and shading. Problem is that as mentioned above, I'm not able to use atomic operations on shared variables and hence I can't build tile light list and store light count for tile.
Problem is I cant' find any other way how to do this.Any idea how to cull & build tile light lists using non-atomics?
Here is pseudo code of my compute shader:
canvas - HTML5 キャンバスを WebGL テクスチャとして使用する方法
したい:
- ケース i の均一値を設定します。
- ケース i の計算シェーダーを HTML5
<canvas>
タグにレンダリングします。 <canvas>
次のレンダー パスでコンテンツ (レンダリング出力の場合) をテクスチャとして使用します。- すべてのケースで繰り返します。
- カラーデータから答えをJSに抽出します。
計算シェーダーを作成しようとしていますが、各レンダー パスでピクセル (フラグメント) ごとに値を運ぶ必要があります。簡単な例は、各レンダー呼び出しでピクセルの青の値をインクリメントすることです。
いえ
この種のシェーダー ループは可能ですか?
マルチパス処理 (標準のシェーダー内マルチパス処理とは異なり、パス間で均一な値を変更する必要がある場合) のためにビデオ メモリに「キャリー」テクスチャを保持するより良い方法はありますか?
hlsl - ComputeShaders の「サンプラー配列インデックスはリテラル式でなければなりません」というエラーを理解する
次のように、グループの Id を使用して Texture2DArray からデータを取得する計算シェーダーがあるとします。
そして、このように起動するとしましょうdeviceContext->Dispatch(2, 0, 0);
つまり、Texture2DArray からピクセル値を読み取る 2 つのグループ、それぞれ 32 のスレッドです。GroupID.x = 0 のすべてのスレッドは gTextureArray[0] から値を読み取り、GroupID.y = 0 のすべてのスレッドは gTextureArray[1] から値を読み取ります。その単純なコードをコンパイルできないことがわかりました。代わりに、このコンパイルエラーが発生しますerror X3512: sampler array index must be a literal expression
今、私は代わりにこれを行うことができることを知っています:
または、グループがたくさんある場合はスイッチを使用して、それほどひどく見えないようにします(それでもそうです)
各グループのすべてのスレッドがいずれかのブランチに移動するため、ワープの発散がないことに注意してください。私の質問は、ここで何か不足していますか? 少なくともこの場合、発散やその他の問題が見られないのに、HLSL がそのようなインデックス作成をサポートしていないのはなぜですか?
c++ - 計算シェーダー - スレッドをグローバルに同期する方法は?
編集:質問を言い換えて、より一般的なものにし、コードを簡素化しました。
コンピューティング シェーダーでのスレッド同期に関する何かが欠けている可能性があります。いくつかの数値で並列削減を行う単純な計算シェーダーがあり、最終的な合計を変更する必要があります。
リダクションが機能し、正しい結果が得られます。最後の条件をコメントすると、値clusters[0].size
は 262144 で、これは正しいです (これはスレッドの数です)。コメントを外すと、値 23 が得られると予想されます。これは、私が理解しているように、後のスレッドをbarrier()
同期する必要がありmemoryBarrier()
、メモリ内の以前のすべての変更が表示されるはずだからです。値 23 は別のスレッドから以前に書き換えられていると思いatomicAdd
ますが、その理由はわかりません。
これは、CPUで結果を読み取る方法です。
NVIDIA GT630M カードと、nvidia 独自のドライバー (331.49) を搭載した Linux があります。
opengl-es - 1 つのフラグメントが WebGL GLSL のすべてのテクスチャ ピクセル値にアクセスできますか? (独自の TexCoord だけではありません)
WebGL と GLSL を使用して計算シェーダーを作成しているとしましょう。
このシェーダーでは、各フラグメント (またはピクセル) がテクスチャ上のすべてのピクセルを調べてから、独自の色を決定します。
通常、フラグメントは提供されたテクスチャ座標 (UV 値) をいくつかのテクスチャからサンプリングしますが、1 つのフラグメントの 1 つのテクスチャからすべての UV 値を効果的にサンプリングしたいと考えています。
これは可能ですか?
opencl - ピクセルベンダーの代替品?
現在放棄されている Pixel Bender に代わるものはありますか? コア ロジックのスクリプト作成に集中でき、画像 I/O、GUI、または低レベルのシェーダー コードについて心配する必要がないフレームワーク。GPU ベースのソリューションは、CPU が遅すぎる距離フィールド生成などの計算負荷の高いタスクに使用したいため、最適です。