0

私はゲームのプログラミングを始めたばかりで、マーチング キューブの例を自分のニーズに合わせて調整しました。マーチング キューブを使用してGoursat のサーフェスをレンダリングしています。現在、マーチング キューブを少し改良したバージョンを使用しています。私が見ているコードは次のとおりです。

gl_pushmatrix();
glBegin(GL_TRIANGLES);
    vMarchingCubes(); // generate the mesh
glEnd();
glPopMatrix();

それがレンダリングされるたびに!これにより、約 20 fps のフレームレートが得られます。マーチング キューブのみを使用してメッシュを構築しているので、レンダリングするたびにメッシュを再構築したくありません。マトリックスを保存したいと思います(必要に応じてサイズを計算できますが、サイズは不明です)。

別のstackoverflowの質問でマトリックスを保存およびロードする方法を見つけましたが、openGL 4.0でこれを行うための推奨される方法ではないと述べています。これを行う現代的な方法が何であるか疑問に思っています。関連する場合は、openGL ES でも利用できるようにすることをお勧めします (可能であれば)。

4

1 に答える 1

1

マトリックスを保存したいと思います(必要に応じてサイズを計算できますが、サイズは不明です)。

「マトリックス」を保存したくありません。メッシュを保存します。また、パフォーマンスの低下の原因は、即時モード (glBegin、glVertex、glEnd) の使用です。

必要なのは、すべての三角形データを保持するいわゆるVertex Buffer Objectです。アイソメトリック サーフェスでは頂点の共有が必要になるため、データを少し前処理する必要があります。最初に、すべての頂点をキー→値構造(C++std::mapなど) に配置し、頂点をキーにするか、セット( boost::set) に配置します。これはマップと実質的に同じですが、このようなタスクのためのより優れたメモリ構造を備えています。新しい一意の頂点に遭遇するたびに、それにインデックスを割り当て、頂点を頂点配列に追加します。また、faces 配列に追加するすべての頂点に対して、割り当てられたインデックス (既に以前の可能性があります):

これ(疑似コード)の行に沿って:

vertex_index = 0
vertex_array = new array<vertex>
vertex_set = new set<vertex, unsigned int>
faces_array = new array<unsigned int>

foreach t in triangles:
    foreach v in t.vertices:
        if not vertex_set.has_key(vertex):
           vertex_set.add( vertex, vertex_index )
           vertex_array.append( vertex )
           vertex_index += 1
        faces_array.append( vertex_set(v) )

vertex_arrayGL_ARRAY_BUFFERバッファ オブジェクトとバッファ オブジェクトにアップロードできるようになりfaces_arrayましたGL_ELEMENT_ARRAY_BUFFER。それが整ったら、通常のglVertex…PointerglDrawElementsスタンザを実行して全体を描くことができます。詳細については、 http: //www.opengl.org/wiki/VBO_-_just_examples および VBO に関するその他のチュートリアルを参照してください。

于 2013-11-07T21:49:43.783 に答える