0

フラグメント シェーダーのレイマーチング アルゴリズムを介してシーンをレンダリングする OpenGL を使用してゲームを開発しようとしています。シーンのレンダリングに使用されたのと同じ符号付き距離フィールド関数を使用して衝突を実装するつもりです。

私が理解しようとしているのは、衝突テストとシェーダーの両方に同じ SDF 関数を 2 回記述することなく使用する方法があるかどうかです。

Frag シェーダー内の C++ 関数にアクセスする方法や、衝突テストに使用する計算シェーダーの出力を取得する方法はありますか?

計算シェーダーから関数を呼び出すためだけに個別のレンダリング パイプライン全体をセットアップするのは、非常に不便に思えます。これを達成するためのより簡単な方法はありますか?

4

2 に答える 2

0

生の OpenGL と GLSL、またはその他の低レベルのレンダリング API を使用したい限り、その API で使用されるシェーディング言語にコードを移植する必要があります。そのコードを移植可能にしたい場合は、より高いレベルのフレームワーク/エンジン/クロスコンパイラを探す必要があります。たとえば、C++ でシェーダーを記述できるものを次に示します。また、C++ コードのロジックも変更が必要になる場合があることに注意してください。これは、シェーダー実行モデルが大規模な同時実行であるためです。頂点シェーダーは頂点ごとに実行され、フラグメント シェーダーはピクセルごとに実行され、計算はスレッドごとに実行されます。実行自体は並行して実行されます (一度にすべてではなく、基盤となるハードウェアの仕様が許す限り多くのことを実行します。Nvidia GPU でどのように動作するかについては、この記事を参照してください)。シリアル アルゴリズムは GPU で非常にパフォーマンスが低下します。

于 2022-02-04T21:38:56.640 に答える