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

voxel - インスタンス化されたオブジェクトを使用したシーンのボクセル化

いくつかの球、立方体、および長方形の壁を備えた、床としての平面を持つ単純なシーンを directx11 で作成しました。読み込まれるオブジェクトは、平面、立方体、球の 3 つだけです。ただし、立方体と球体は、スケーリング、位置、および回転が異なる複数回インスタンス化されています。これらのオブジェクトのうち 2 つは動的です。

スケールと回転が異なるオブジェクト インスタンスを考慮して、このシーン全体 (100x100x20 単位) を 0.2 単位のボクセルにボクセル化したいと思います。

ボクセル化に関するいくつかの記事を読み、「Direct3D 11 を使用した実用的なバイナリ サーフェスおよびソリッド ボクセル化」の GPU Pro 3 のソース コードを入手しました。しかし、これらの記事はすべて、単一のオブジェクトのボクセル化を示しています - それらの三角形を取り、それらをグリッドに分割します.

これらのメソッドを拡張して、複数のオブジェクト インスタンスを持つシーン全体を考慮するにはどうすればよいでしょうか?

考えられる唯一のことは、シーン全体をトップダウンで octree 分割する必要があるということです。しかし、動的なシーンの場合、これはコストが高すぎるでしょうか?

私のシーンでは、読み込まれたモデルごとにバッファを使用しています。したがって、Compute Shader でボクセル化する場合、3 つのバッファすべてを 1 つのバッファにコピーする必要がありますか? モデル インスタンスはどのように説明すればよいですか?

ありがとうございました。

0 投票する
2 に答える
5221 参照

c++ - シェーダーでの DirectX シェーダー リソース ビュー

私は今少し混乱しているので、いくつかのアイデアを明確にするのを手伝ってくれるよう皆さんにお願いしたいだけです.

HLSL シェーダー (コンピュート シェーダーなど) では、StructuredBuffer sb を宣言できますよね? register(t0) などのレジスタにバインドする必要がありますか?

アプリケーション側からは、CSSetShaderResources(...) を呼び出すことができます。最初の引数 (StartSlot) は、レジスタ宣言の "t" の後ろにある小さな数字と関係がありますか?

たとえば、StartSlot を 0 に設定し、2 番目の引数を 2 に設定した場合、1 つは register(t0) に、もう 1 つは register(t1) にある 2 つの Shader Resource View をバインドすることを API に伝えていますか?

Texture2D tex[10] : register(t0) を宣言すると、CSSetShaderResources(0, 10, ...) を呼び出して設定できます。これは、レジスタ(t0~t9)がすべて使用されているということですか?

このような「急速な」質問で申し訳ありませんが、私は本当に混乱しており、いくつかのテストでは相反する結果が得られているようです...

どんな助けでも大歓迎です。

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

directx-11 - directx 11 で 1 回のパスで複数のテクスチャにレンダリングする

C++ directx 11 SDK を使用して、1 つのパスで 2 つのテクスチャにレンダリングしようとしています。1 つのテクスチャに結果イメージの各ピクセルの色 (3D シーンをレンダリングするときに画面に通常表示されるもの) を含め、別のテクスチャに各ピクセルの法線と深さ (法線用に 3 つの float と 1 つの float) を含める必要があります。深さのため)。今考えられるのは、2 つのレンダリング ターゲットを作成し、最初のパスを色としてレンダリングし、2 番目のパスで法線と深度を各レンダリング ターゲットにそれぞれレンダリングすることです。ただし、最初のパスで各ピクセルの色、法線、深度の情報を取得できるため、これは時間の無駄に思えます。ピクセル シェーダーで 2 つのテクスチャを出力する方法はありますか?

どんな助けでも大歓迎です。

PS ピクセル シェーダーの RWTexture2D または RWStructuredBuffer に沿って何かを考えています。ちょっとした背景: 計算シェーダーでさらに処理するには、2 つの画像が必要です。これにより、同期に関する副次的な問題が生じます。ピクセル シェーダーは (計算シェーダーとは異なり) 各ピクセルを一度に 1 つずつ書き込むため、ピクセル シェーダーが終了したことをどのように認識し、計算シェーダーに画像の後処理を開始するように指示するのでしょうか?

0 投票する
2 に答える
5831 参照

c++ - OpenGL コンピューティング シェーダーの呼び出し

新しいコンピューティング シェーダーに関する質問がありました。私は現在、粒子システムに取り組んでいます。すべてのパーティクルをシェーダー ストレージ バッファーに格納して、計算シェーダーでそれらにアクセスします。それから私は一次元のワークグループを派遣します。

私の計算シェーダー:

しかし、どういうわけか、すべての粒子が影響を受けるわけではありません。この例と同じ方法で実行していますが、うまくいきません。http://education.siggraph.org/media/conference/S2012_Materials/ComputeShader_6pp.pdf

編集:

glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT) を呼び出した後、次のように続けます。

この場合、どのビットを使用するのが適切でしょうか?

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

gpgpu - GPU Context Switch

I have a program which renders first to a texture, then pass the texture to the compute shader for processing, then renders the output result to the screen via a textured full screen quad.

I've read in the nVidia's programming guide for compute shaders that every time you dispatch a compute shader, it initiates a GPU device context switch, which should not be done quite often.

I'm very confused right now. The way I see it, in my rendering pipeline the GPU switches contexts twice. Right? Once during the first dispatch call, the next time when I render my full screen quad normally.

If this is correct, then I can avoid one switch by reorganizing my code like this. First, render to a texture. Second, do the processing on the compute shader. Then, IN THE NEXT FRAME, render the result, then (still in the next frame) render all updates to texture, do processing on compute shader... So basically every start of the frame I render the results of the last frame (the first frame will be an exception). Then there will only be one context switch, right?

But then the GPU will still have to do a context switch between the frames, right? So the two versions of my rendering pipeline all have two context switches. There would be no difference in performance. Am I correct?

Any help would be appreciated.

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

directx-11 - 放射照度ボリュームとタイル化されたディファード シェーディング

DirectX 11 のレンダラーを使用して、コンピューティング シェーダーでディファード シェーディングとタイル ライト カリングを使用しています。30 ~ 35 FPS の安定したフレームレートで 1024 ~ 2048 個のポイント ライトを実行できます。ただし、グローバル イルミネーションはありません。放射照度ボリューム (Crysis3 で使用) はより良い解決策ですか? シーンに 2000 の放射照度ボリュームを持ち、30 FPS を持つことはできますか? それとも、現在の方法に固執して、グローバル イルミネーションを忘れるべきでしょうか?

0 投票する
3 に答える
5942 参照

opengl - imageStore() の問題 (OpenGL 4.3)

計算シェーダーからテクスチャーにデータを出力しようとしていますが、imageStore() は何もしないようです。シェーダーは次のとおりです。

アプリケーションコードは次のとおりです。

次に、そのテクスチャで全画面クワッドがレンダリングされますが、現在、ビデオ メモリからのランダムな古いデータのみが表示されます。何が間違っている可能性がありますか?

編集:

これは、テクスチャを表示する方法です。

drawProgram は次のもので構成されます。

と:

フラグメント シェーダーの最後のコメント行は、次の出力を生成します

頂点配列オブジェクト (vao) には、6 つの 2D 頂点を持つ 1 つのバッファーがあります。

-1.0、-1.0

1.0、-1.0

1.0、1.0

1.0、1.0

-1.0、1.0

-1.0、-1.0

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

hlsl - RWTexture2D からの読み込み計算シェーダーで

HLSL シェーダー モデル 5.0 には、非スカラー型の RWTexture2D リソースからデータをロードできないという制限があることを理解しています。つまり、以下は違法です。

では、回避策は正確には何ですか?次のように、計算シェーダーの float4 バッファーに蓄積しようとしています。

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

directx - 計算シェーダー、複数のスワップチェーンを使用した遅延シェーディング?

こんにちは。dx11エンジンに遅延シェーディングを追加するつもりですが、アーキテクチャに関する質問があります。最初にMRTを使用してgbufferをレンダリングし、それを計算シェーダーに渡してディスパッチし、結果を出力することを考えていました。私の質問は、2つのスワップチェーンを作成します。1つはgbufferをレンダリングし、もう1つはuavを作成して、計算シェーダーをバックバッファーにレンダリングして表示しますか、それとも別の方法がありますか。ここで避けようとしているのは、fullscren quadを使用して、csの出力をレンダリングする必要があることです。オーバーヘッドが多すぎます。前もって感謝します。

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

opengl - 計算シェーダーを介した OpenGL でのレイトレーシング

計算シェーダーを介して OpenGL でレイトレーシングを実行しようとしていますが、奇妙な問題に遭遇しました。現時点では、シェーディングなしで球を表示したいだけです。私の計算シェーダーは、すべてのピクセルに対してレイを起動し、次のようになります。

アプリケーションを実行すると、次の画像が表示されます。 ここに画像の説明を入力

しかし、CPU で同じアルゴリズムを実行すると、次のより説得力のあるイメージが得られます。 ここに画像の説明を入力

最初に、すべてのピクセルが独自の計算シェーダー呼び出しを取得しないように、十分なワークグループをディスパッチしなかったと考えましたが、そうではありません。GPU でレンダリングされたイメージでわかるように、コンピューティング シェーダーの最後の行が原因で、中央に赤いピクセルがあります。これは、1 ピクセルおきに再現できます。

現時点では 1024x768 の解像度を使用しており、計算シェーダーをディスパッチする方法は次のとおりです。

間違いはどこですか?浮動小数点計算の精度に問題があるのでしょうか?