1

以前ここで VBO に関していくつか質問をしましたが、受け取ったコメントから、新しいアプローチを採用する必要があると判断しました。

簡単に言えば、約512X512ポイントの大きなFLOAT配列で定義されたマンデルブロー集合を描画しようとしています。私のプログラムの目的は、ユーザーがズームと世界の向きを制御できるようにすることです (これは 3D モデルです)。これまでのところ、描画プロセスが遅いため、GL_TRIANGLE_STRIP を使用して全体を描画しましたが、これは悪い選択でした。また、私の描画スタイル (glVertex を呼び出す順序) を実装すると、VBO のコーディングが不可能になったためです。

それでいくつか質問があります。

この説明の後でも、計算を制御するのはユーザー次第であるため、VBOが最良の選択であるかどうかはわかりません.プログラムによって引き起こされる計算ごとに、マンデルブロセットを再計算し(〜60ms)、再コピーする必要がありますバッファへのポイント: 時間がかかるプロセス (?ms)。

このプログラムでは、ユーザーが世界を移動することもできるため、ここでは計算が行われないため、ここでは VBO が最適です。

1.高さマップを描画する最良の方法は何ですか (配列内の各セルが高さのみを保持する場合)

2.VBOに適用してcudaに転送するにはどうすればよいですか(cudaRegisterBufferなど)

3. モードを区別し、VBO が必要な場合 (計算なしモード) と必要でない場合 (計算モード) を決定する方法はありますか?

4

1 に答える 1

1

バインドする場合、フレームごとにCUDAデータをコピーする必要はありませんCUDAアレイ/VBOからDirectX/OpenGL VBへ(詳細については、CUDAプログラミングガイドを参照してください)。データを高さフィールドとしてレンダリングする1つの方法は、ジオメトリシェーダーを使用して、高さフィールドに基づいてトリスを放出することです。もう1つの方法は、高さフィールドを視差マップとして使用することです(DirectX SDKを参照)。私の個人的なお気に入りは、高さフィールドを位置の配列(X / Y / Z)にし、CUDAを使用してY値のみを変更してから、インデックスバッファーを使用してサーフェスを構成するポリゴンを定義することです。頂点法線も更新する必要があることに注意してください。また、サーフェスにテクスチャを適用する場合は、XYZ/UVを使用することもできます。512x512が大きすぎる場合は、raster-ops(テクスチャサンプリング)を使用して、対象領域の低解像度の高さフィールドにデータを入力します。この段階は、CUDAまたはOpenGL / DirectXで実行できます(I '

于 2011-12-19T03:37:18.100 に答える