2011-12-17 3 views
1

ここで以前にVBOに関するいくつかの質問を受けました。私が受け取ったコメントから、新しいアプローチが必要であると判断しました。CUDAを使用したOpenGLの高さマップペイントVBO

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

私はいくつか質問があります。

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

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

1.what(配列内の各セルは高さのみを保持している場合)

2.howを高さマップをペイントするための最良の方法は、私はVBOでそれを適用することができますし、CUDA(cudaRegisterBufferまたはそのような何かにそれを転送します)

3.isはモードを区別し、VBOが必要なとき(計算モードなし)とそうでないとき(計算モード)を決定する方法です。あなたは CUDA配列をバインド場合

+0

'glBegin/glEnd'では、GPUごとにデータ全体を各フレームにコピーしていますが、この場合、個々の頂点ごとに重いシステムコールがあります。だから、VBOは常に正しい方法です。計算がCUDAによって行われる場合は、VBOデータをCPUにコピーする必要はまったくありません。 –

答えて

1

あなたはCUDAデータの各フレームをコピーする必要はありません/ DirectXの/ OpenGLのVBにVBO(詳細については、CUDAプログラミングガイドを参照してください)。高さフィールドとしてデータをレンダリングする1つの方法は、ジオメトリシェーダを使用して高さフィールドに基づいてトリスを放出することです。別の方法は、高さフィールドを視差マップ(ref DirectX SDK)として使用することです。私の個人的なことは、高さフィールドに位置の配列(X/Y/Z)を作成し、CUDAを使ってY値のみを変更し、インデックスバッファを使用してサーフェスを構成するポリゴンを定義することです。頂点の法線を更新する必要があることに注意してください。また、サーフェスをテクスチャ化する場合は、XYZ/UVを使用することもできます。 512x512が大きすぎる場合は、raster-ops(テクスチャサンプリング)を使用して、関心領域の低解像度の高さフィールドを設定します。 CUDAやOpenGL/DirectXでこの段階を行うことができます(CUDAで、ダウンサンプリング時にピクセルを検索するための独自のサンプリングカーネルを簡単に作成することをお勧めします)。

関連する問題