問題タブ [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.
directx - Compute ShadersおよびDirect2Dとの相互運用?
私はWPFとDirectXを統合するアプリに取り組んでいます。私の目標は、次の目的で使用する1つの共有サーフェスを作成することです。
- 初期画像データをロードします。
- DirectX 11 Compute Shadersを実行して、画像処理を行います。
- Direct2Dで上に描画します。
- 結果をWPFアプリに表示します。
私は1、3、4を理解していると思いますが、2は私に頭痛の種を与えています。私の基本的な問題はこれに要約されます。共有サーフェス形式はB8G8R8A8_UNorm
WPFとDirect2Dの相互運用用である必要があると思いますが、そのタイプのテクスチャでComputeShaderの順序なしアクセスビューを作成することはできません。
このシナリオでComputeShadersを機能させるにはどうすればよいですか?UAVを作成するためのトリッキーな方法を見逃しましたか?どういうわけか複数のテクスチャを使用するためにアプリを再構築する必要がありますか?
c++ - DX11 動的サイズのバッファ
大学のプロジェクトで変形可能なボクセル テレインを作成しようとしています。現在、ボクセルデータを「チャンク」に保持するために、いくつかの 3DTextures を使用しています。私の計画は、コンピューティング シェーダーを使用して、前述のボクセル データに対してマーチング キューブ アルゴリズムを実行し、頂点をバッファーに出力してから、各フレームをレンダリングできるようにすることでした。
問題は、使用している構造化バッファー用に UAV をセットアップするために、D3D11_BUFFER_UAV の NumElements に含まれる要素の数を知る必要があることです。含まれる可能性が高い最大値について推測することはできますが、計算シェーダーが終了するまで実際にいくつになるかを知る方法はなく、これが問題を解決する最良の方法ではない可能性があることに気づきました.
私が本当にする必要があるのは、後で保存してレンダリングできる任意の数の頂点を計算シェーダーに出力させることだけです。これを行うための最良の方法についてのアイデアはありますか?
directx - DirectX コンピューティング シェーダーは、共有メモリ内の 2D 配列をサポートしていますか?
groupshared
DirectX コンピューティング シェーダーでメモリを使用して、グローバル メモリ帯域幅を削減し、できればパフォーマンスを向上させたいと考えています。私の入力データは で、次のTexture2D
ように 2D インデックスを使用してアクセスできます。
入力データの一部をキャッシュするための共有メモリの 2D 配列が必要なので、明らかなことを試しました。
コンパイルされません。エラーメッセージは言うsyntax error: unexpected token ','
。
共有メモリの 2D 配列を持つ方法はありますか? そうでない場合、共有メモリの 1D 配列に格納された 2D データを操作するための適切な手法は何ですか?
wpf - 遅延を発生させずに長い計算にシェーダーを使用する
DirectX 11 で Compute Shader を使用して、単純ではあるが高価な計算を実行しようとしています (Mandelbrot Set を考えてください)。計算結果はテクスチャに配置され、オーバーラップしません。1 ~ 10 秒かかると予想されるため、リアルタイムではありませんが、終了するとすぐに UI に表示されます。
http://directx4wpf.codeplex.com/経由で WPF と SharpDX を使用しています。そのライブラリには、RenderScene 関数を備えた DX11 ビュー オブジェクトがあり、DX レンダリング関数が呼び出され (コンピューター シェーダーを含む)、メイン スレッドで実行され、私の理解では、できる限り頻繁に呼び出されます (FPS を最大化しようとします)。 )。明らかに、コンピューター シェーダーを固定するオプションはありません。メイン スレッドが残りの UI と共にブロックされ、GPU も使用している場合は OS の残りの部分もブロックされるからです。
問題は、アプリケーションの残りの UI に遅れを生じさせずに、これらの計算をどのように実行すればよいかということです。
これが純粋に CPU で実行される場合は、別のスレッドを実行するだけです。ただし、GPU の初歩的な理解では、GPU はスケジューリング/コンテキスト切り替えにあまり適していないという印象を受けています。したがって、別のスレッドで計算を実行しても (DX11 で遅延レンダリングを使用)、計算が完了するまで GPU がブロックされます。あれは正しいですか?
計算シェーダーの作業を小さな断片 (約 8000 スレッド) に分割しようとしました。これは、基礎となるジオメトリがなくても実行可能です。計算シェーダーを呼び出すたびにオフセットを追加するだけです。膨大なオーバーヘッドがあるため、実際には機能しません。実際、(計算シェーダーを連続して N 回呼び出すことによって) 作業を N 個に分割すると、N 倍の直線的な速度低下が発生するようです。 、または GPU の使用に関する避けられない事実です。
そのようなシナリオでどのように進めるかについて提案がある人はいますか?おそらく似たようなことを行うサンプルプロジェクト、または読むべき良いリソースですか? 私は誤った仮定をしていますか?
synchronization - glsl計算シェーダーでのピンポン伝播は1回の呼び出しで可能ですか?
glsl 計算シェーダーを使用して 32x32x32 の 3D テクスチャの伝播スキームを実装しようとしています。シェーダーを 1 回実行するだけで x 回の反復を実行できれば非常に便利です。
3 つのテクスチャがあります。1 つはソース、1 つはターゲット、3 つ目はすべてを蓄積します。ソースとターゲットは、反復ごとに交換する必要があります。擬似コードは OpenGL のようになります。
GLSL:
問題は、テクスチャのサイズが原因で、1 つのワークグループでこれらすべてを実行できないことです。1 つのワークグループ内であれば、barrier() を使用するだけで問題ありません。テクスチャの交換のため、次のイテレーションから再度読み取る前に、すべての値を更新する必要があります。これが何らかの形で可能かどうか、誰かに考えがありますか?
ありがとうマルク