1

VBOやインデックスなどで最新のOpenGLを使用しています。

最初に高さマップから地形をロードし、ブロック (私の場合は 128x128) に分割します。すべての頂点を (地形ブロックごとに) VBO にロードします。次に、4 つの LOD レベル (インデックス テーブル) があり、かなり静的です。

レンダリング中に、カメラからの距離に基づいてブロックを選択するだけです

    if(distance > 768.0)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod4);
    else if(distance > 512.0)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod3);
    else if(distance > 128.0)
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod2);
    else
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cells[i].elementbuffer_lod1);

そして、ここで問題に遭遇しました。すべて正常に動作しますが、ロッド レベルの異なるブロック間に非常に醜いひび割れがあります。グーグル中にそのようなpdfを見つけました:http://www.flipcode.com/archives/article_geomipmaps.pdfそして私はその考えを理解していますが、VBO(上記)を使用してそれを実装する方法が本当にわかりません。いくつかのアイデアをお聞かせいただければ幸いです。

4

1 に答える 1

0

インデックス バッファは、レンダリングしているブロックから独立していることに注意してください。同じインデックス バッファーを異なるブロックに (再) 使用できます (描画呼び出しで cell[i] に依存する理由がわからないため、これを強調することにしました)。

次に、1 つのブロックについて、隣接する 4 つのブロックの詳細レベル (LOD) を考慮する必要があります。隣接する 4 つのブロックすべてがこれと同じ LOD を持っている場合は、既に行っていること以外に何もする必要はありません。このブロックが LOD の低いブロックに接続されている場合は、記事で参照されているトリックを適用してギャップを隠すことができます。これは、これらの特定のケースに対して追加の事前計算されたインデックス バッファーが必要になることを意味します (毎回 1 つがいっぱいになり、おそらく 2^4 = 16 の異なるインデックス バッファーになるか、描画呼び出しを分割して境界線を個別に処理できます)。また、記事のトリックは、隣接するブロック間の最大 1 レベルのギャップにのみ適用されます。隣接する 2 つのブロックの LOD のギャップが 1 だけになるように、詳細レベルが空間的に分散されていることを確認する必要があります。または、別のトリックを見つけたり、これを一般化したりします。マスキング スカート (ブロックの境界を垂直に押し出す) を使用して、異なる LOD を持つブロック間の広い隙間を隠すことができます。

于 2013-12-31T16:34:25.703 に答える