問題タブ [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# - Unity コンピューティング シェーダーの頂点インデックス エラー
私は計算シェーダーと、それを使用して y 軸上の頂点の配列を変更するために使用される C# スクリプトを持っています。
しかし、正常に動作するという事実にもかかわらず、シェーダーは私の形状の最初の頂点を忘れているようです (その形状が閉じたボリュームの場合を除く?)
C# クラスは次のとおりです。
そして私の計算シェーダースクリプト:
最初は同じバッファから読み書きしていましたが、問題が発生したため、別のバッファを使用しようとしましたが、成功しませんでした。私はまだ同じ問題を抱えています。
計算シェーダーの使用方法を誤解している可能性があります (頂点シェーダーを使用できることはわかっていますが、計算シェーダーをさらに改善するために試してみたいだけです)。
私が言ったことを完了するために、Mesh.vertices Array で頂点にインデックスを付ける方法に関連していると思います。
さまざまなブロック/スレッド構成をたくさん試しましたが、試した問題の組み合わせを解決するものは何もないようです:
私が覚えていない他のいくつか。以下のようなバランスの良い構成がベストだと思います。
閉じたボリュームについて: Cube {8 Vertices} ではすべてがそれに応じて移動するように見えるため、それについてはわかりませんが、頂点の数が奇数の形状では、最初の (または最後はまだチェックしていません) ようです処理されません
さまざまな形状で試してみましたが、分割された平面が最も明白で、1 つの角が常に動かないことがわかりました。
編集 :
さらに調査した結果、メッシュの最後の (最初にチェックした頂点ではなく) 頂点を計算しないのは単に計算シェーダーであることがわかりました。これはバッファーの種類に関連しているようです。なぜ RWStructuredBuffer が問題になるのか、まだわかりません。ストリーム用に予約されていますか? これに関するMSDNドキュメントを理解できません。
編集:解決後
C# スクリプト:
VCount*VCount を使用していたので、頂点を必要以上に "2 乗" 回処理していたのはロジックだったので、回答の前に既に Blocks VCount,1,1 にロールバックしていました。
完了するには、ストライドが明らかに問題を引き起こしていることは間違いありませんでした。ストライド パラメータに関するドキュメントへのリンクを使用して回答を完成させていただけますか? (Unity ドキュメントは VOID であり、MSDN は 32 ではなく 12 であるべき理由を理解するのに役立たなかったため、どこからでも (32 は float3 のサイズだと思っていたので)
Docが必要です
それまでの間、これをより強力にするために十分に柔軟な (ジェネリック?) バージョンを提供し、シェーダーにいくつかの優れた配列処理関数を追加することを試みます...
unity3d - Unity コンピューティング シェーダー、SV_DispatchThreadID による配列インデックス
Compute Shader の GPU での配列のインデックス付けに問題があり、何週間もその問題に悩まされています。
SV_DispatchThreadID の x 値をパーティクル配列のインデックスとして使用しようとしています (Web 上の例に示されているように)。
それは機能しています...しかし、threadID変数(メイン関数内)は常に0,3,6,9,12,15を返しています... 0,1,2,3,4ではありません...
CPU 側でのディスパッチ呼び出しは次のとおりです。 Dispatch(64, 1, 1);
私はディスパッチ (32,16,1), (128,1,1),... の多くの構成を試しました。 ,16,1)...しかし常に同じ結果...
順序付きインデックスを取得するにはどうすればよいですか? :(...常に0、3、6、9などのインデックスを取得します...
なにか提案を?
どうもありがとう。
これが私の CS カーネルと私の C# ソースです。
ComputeBuffer などを作成する C# コード:
ここでは、頂点、ジオメトリ、およびピクセル シェーダー:
opengl - Compute Shader と Cuda 間のマッピング
Computer Shaders と Cuda の違いと、それらがどのように動作するかを理解しようとしています。私はCudaのみを使用しており、私が理解しているように:
シェーダーベースのコンピューティングでは、シェーダーの数はピクセルの数と同じですが、Cuda では、複数の「ピクセル データ要素」に対して動作するカーネル スレッドを使用できます。
Cuda には、データをフェッチできるさまざまなメモリ タイプ (グローバル、共有、定数、テクスチャ) がありますが、シェーダー ベースのコンピューティングでは何が起こるのでしょうか? さまざまなメモリの種類と、コンピューティングがグラフィックス (カーネル、入力、出力) にどのようにマップされていますか? Compute Shaders ではプロセス間の通信がないというのは本当ですか (Cuda の共有メモリと同期など)? また、コンピューティング シェーダー カーネルに関するその他の制限はありますか?
c# - Unity C# ボクセル有限水最適化
(基本的な) ボクセル エンジンを実行し、水システムは次のようになります (基本的には機能すると思います): https://www.youtube.com/watch?v=Q_TdeGIOOts (私のゲームではありません)。
水の値は浮動小数点数の 3D 配列に格納され、0.05 秒ごとに下と隣接するボクセル (y-1、x-1、x+1、z-1、z+1) をチェックして水の流れを計算し、追加します。値。
このシステムは、少量の水 (70+ fps) に対しては正常に機能しますが、8 つ以上のチャンクで水の計算を開始すると、計算が多すぎます。(すべてのレンダリングまたはメッシュ作成を無効にして、それがボトルネックであるかどうかを確認しました。それは純粋にフロー計算です)。
私は経験豊富なプログラマーではないので、すでに行ったようにコルーチンで計算を行うことを除けば、どこから最適化を開始すればよいかわかりません。
この投稿では: https://gamedev.stackexchange.com/questions/55414/how-to-define-areas-filled-with-water (下部近く) Boreal は、計算シェーダーで実行することを提案しています。これは私のために行く方法ですか?そして、どうすればそのようなことをすることができますか?
どんな助けでも大歓迎です。
c++ - 計算シェーダーのリンク
この小さな例をコンパイルしようとすると 、make の実行中に次のエラーが発生します。
私は何が欠けていますか?
opengl - OpenGL でのデータのレンダリング: Vertices および Compute シェーダー
グラフィックプログラムに多数の頂点を入力できるようにしたいのですが、それらに対して次のことができるようにしたいと考えています。
- OpenGL のグラフィック部分、特に Vertex Shader で使用します。
- Compute Shader で物理計算を行います。
これらの要件により、頂点を格納し、それらに正しくアクセスできる構造が必要であることがわかりました。次のことを考えました。
- ArrayBuffers
- テクスチャ (テクスチャリング自体ではなく、情報を保存するため)
ただし、両方のバリアントの欠点を考えて思いつきました。
ArrayBuffer:
- コンピュート シェーダーがどのように頂点を変更するどころか、読み取ることができるかわかりません。それでも、私はそれらを描く方法を知っています。
テクスチャ:
- Compute Shaders でそれらを変更する方法は知っていますが、テクスチャから描画する方法がわかりません。より具体的には、描画する必要がある要素の数は、テクスチャに書き込まれた (ゼロではないデータ) 要素の数に依存します。
私のニーズを満たすいくつかの重要な他の機能を見落としている可能性があるため、実際の質問として
、GPU に存在し、頂点と計算シェーダーの両方でアクセスできる頂点を作成するにはどうすればよいですか?
c# - Compute Shaders Input 3d 配列の浮動小数点数
Unity 4 で使用するコンピュート シェーダーを作成しています。3D ノイズを取得しようとしています。
目標は、C# コードから計算シェーダーに多次元 float3 配列を取得することです。これは簡単な方法 (ある種の宣言を使用) で可能ですか、それとも Texture3D オブジェクトを使用してのみ達成できますか?
私は現在、個々の float3 ポイントで動作するシンプレックス ノイズの実装を持っており、単一の float -1 から 1 を出力します。計算シェーダー用にここにあるコードを移植しました。
Vector3[,,]
これを拡張して、配列内の各 float3 ポイントにノイズ操作を適用することにより、float3 の 3D 配列 (C# で最も近い比較は になると思います) で動作するようにしたいと思います。
他にもいくつか試してみましたが、それらは奇妙に感じられ、並列アプローチを使用するポイントを完全に見逃しています。上記は、私がそれがどのように見えるべきかを想像するものです。
また、Scrawk の実装を頂点シェーダーとして機能させることもできました。Scrawk は、 Texture3D を使用してシェーダーに 3D float4 配列を取得しました。しかし、テクスチャからフロートを抽出できませんでした。コンピュート シェーダーも同様に機能しますか? テクスチャに依存していますか? テクスチャから値を取得することに関して、おそらく何かを見落としているでしょう。これは、このユーザーがこの投稿でデータを取得する方法のようです。私と同様の質問ですが、私が探しているものとはまったく異なります。
一般的にシェーダーは初めてで、コンピュート シェーダーとそのしくみについてかなり基本的なことが抜けているように感じます。目標は、(ご想像のとおり) コンピューティング シェーダー (またはこの種の作業に最適なシェーダー) を使用して、マーチング キューブを使用してノイズ生成とメッシュ計算を GPU で行うことです。
Constraints は Unity 4 の無料試用版です。
私が使用しているC#コードのスケルトンは次のとおりです。
そして、これが計算シェーダーです