0

LWJGL を使用して Minecraft のようなボクセル エンジンを作成していますが、最適化で問題が発生しています。さて、明らかに、カリングはおそらくパフォーマンスに大きなプラスの影響を与えるでしょう。そのため、バック フェース カリングを行うために、次のようなことを行いました。

    if (chunk.getWorld().getGame().cam.getZ() >= zz) 
    {
        glTexCoord2f(1, 1);
        glVertex3f(1, 1, 0);
        glTexCoord2f(0, 1);
        glVertex3f(0, 1, 0);
        glTexCoord2f(0, 0);
        glVertex3f(0, 0, 0);
        glTexCoord2f(1, 0);
        glVertex3f(1, 0, 0);
    }

そして、いくつかの問題が発生するまでは問題なく動作します。非表示の面 (ブロック間の面) が引き続き描画され、表示リストを使用すると正確に更新されません。これが私の質問です。表示リストを使用してどのように選別しますか? glEnable(GL11.GL_CULL_FACE); をやってみました。しかし、それは私にこれを返しました.それは後ろではなく正面を選別しているようです:

カリング有効

カリング無効

これは、glEnable によってカリングが有効になっていないため、私のカリングも無効になっています (リストでは無意味なので)。すべて問題ないように見えますが、パフォーマンスは大幅に改善される可能性があると思います。

これは私のコードです。何か不足している場合はお問い合わせください。必要に応じてプロジェクト全体をアップロードできます。

編集:立方体を描画するために他のコードをコピーしましたが、カリングを有効にしても正しく見えません。

4

2 に答える 2

2

最初に - あなたの説明から

「見えない面がまだ描かれている(ブロック間の面)」

設計上の問題があるようです。顔があるかどうかは、ビューではなくモデルに依存する必要があり、カリングはビューに関連する概念です。


「表示リストを使用すると、正確に更新されません」

Red Book の「表示リストに保存されているもの」の章を見てください。


「しかし、それは私にこれを返しました。それは後ろではなく前の顔を選別しているようです:」

法線がポリゴン モードに適合しない可能性があります。

立方体の場合、面の法線を計算するのは非常に簡単です。立方体の中心 cc_ と面の中心 cf_ を取得するだけです (疑似コードで)。

n_ = (cf_ - cc_);
n_ = normalize(n_);

外向きの面の法線を生成します。

于 2013-05-18T20:31:53.233 に答える