OpenGLテッセレーションでの頂点ごとの計算


9

ハードウェアテッセレーションを使用して、位置ベースのクロスシミュレーションを実装しようとしています。つまり、コントロールクワッドをグラフィックスカードにアップロードし、テッセレーションとジオメトリシェーディングを使用して、クロスにノードを作成します。

このアイデアは論文に従います:

Huynh、David、「ハードウェアテセレーションを使用したクロスシミュレーション」(2011)。定説。ロチェスター工科大学 http://scholarworks.rit.edu/theses/265/

テッセレーションを使用してシミュレーションポイントを作成する方法を知っています。私が知らないのは、計算された情報をフレームバッファに格納する方法です。

ジオメトリとテッセレーション評価シェーダーには、頂点ごとの計算に必要な情報があります。しかし、フレームバッファに直接書き込むことはできますか?

私が知っているフラグメントシェーダーはフレームバッファーに書き込むことができますが、私の情報は補間され、どの位置に何を書き込むかがわかりません。


フィードバックバッファーの変換
ラチェットフリーク

とてもいいですね。クロスシミュレーションの制約により、パーティクルのすべての近傍にアクセスできる必要があります(ばね力を計算するため)。これはそのようなバッファで実行できますか?ジオメトリシェーダーでは多分?フィードバックバッファーが各頂点を複数回印刷するのを防ぐために、GL_POINTSを使用したいと思います。一見したところ、これはばねの計算を難しくしているようです。
Dragonseel

回答:


3

「ラチェットフリーク」のコメントに基づいて、Transform Feedback Bufferを調査し、問題を解決しました。

次に、CPUでシミュレーションポイントを生成し、それらをVertexBufferObjectに配置します。ポイント用に2つ目のVBOを生成します(速度用の他のVBOとともに)。クロスの接続性は、ivec4の頂点属性として指定されます。

変換フィードバックバッファーを使用し、2つのVBOを使用してダブルバッファリングトリックを使用すると、常に(接続情報を使用して)最後のステップから読み取り、別のバッファーに書き込むことができます。これは、並行性に関する問題を解決するためです。

計算は、頂点シェーダーでGL_POINTSとして行われます。追加のインデックスバッファーを使用して最初のシェーダーの出力を別の通常のシェーダーにバインドし、問題なくクロスを適切にレンダリングできる三角形を生成します。

このアイデアは、本「OpenGL Superbible」http://www.openglsuperbible.com/で作成された変換フィードバックバッファの例に従います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.