3

深度テストを有効にするには、OpenGL の init メソッドに何を追加する必要がありますか? また、それを実際にテクスチャ レイヤリングにどのように使用しますか?

glOrtho の最後のパラメーターを -1 よりも極端なものに拡張する必要があり、もちろん glEnable 深度テストも必要です。それを使用するには、glVertex の 3 番目のパラメーターを 0 以外の値に変更して、他のテクスチャの前/後ろに送信することしか考えられません。

私はこれを試してみましたが、いまいましいテクスチャは表示されません。xD 何かが欠けているに違いない。


編集: RE: ティムの応答

画像のzを-1よりも極端にすると、画面が真っ黒になることはありませんでした。

void initGL(){

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_DEPTH_TEST); //depth test enabled

    GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glOrtho(-width/2, width/2, -height/2, height/2, 1, -10);//far changed to -10
    GL11.glMatrixMode(GL11.GL_MODELVIEW);

}

void loadBG(int theLoadedOne){

GL11.glBindTexture(GL11.GL_TEXTURE_2D, theLoadedOne);
GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0,0);
GL11.glVertex3f(-width/2,height/2, -2);//new z value

    GL11.glTexCoord2f(1,0);
GL11.glVertex3f(width/2,height/2,-2);//new z value

    GL11.glTexCoord2f(1,1);
GL11.glVertex3f(width/2,-height/2,-2);//new z value

    GL11.glTexCoord2f(0,1);
GL11.glVertex3f(-width/2,-height/2,-2);//new z value

GL11.glEnd();
GL11.glFlush();

}

while(!Display.isCloseRequested()){
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

...

            for(int i=0;i<1;i++){  //dont mind this for loop
                bg.loadThisBG(0);  //its here for reasons
            }
            updateFPS();

        Display.update();

    } Display.destroy();

}
4

2 に答える 2

1

ニアプレーンとファープレーンを切り替えたようです。gluOrtho2Dを見てください。とで呼び出すだけglOrthoで、z 座標の切り替え記号 ( ) が生成されます。ただし、上記の値を使用すると、は正になり、z 軸は標準ワークフローに逆になります。near=-1far=+1m33=-2/(far-near)m33=-2/(-10-1)

これは、背面から見たクワッドに影響します。

OpenGL の行列操作メソッドは、何をフィードするかは気にしません。ただし、値がゼロ除算になる場合を除きます。


モデルビュー変換がなく、投影に寄与するマトリックスが 1 つだけであると仮定すると、次のようになります。

ワールドから NDC 空間への z 値の変換はz_ndc = -9/11 * z_w + 2/11(正射行列の近くと遠くに設定され、3 行目を取る) です。今、、z_w=-2などz_ndc = 20/11。これは NDC 空間境界の外にあり、破棄されます。

このテストは、Z テスト自体で暗黙的に有効/無効になっていると思います。次の容疑者はバックフェイスカリングだろう...

于 2012-04-04T04:21:49.967 に答える
1

コンテキストに深度バッファーが含まれている場合 (lwjgl バッファーの作成についてはわかりません...)

必要なのは次のとおりです。

  • glEnable(GL_DEPTH_TEST)初期化中の呼び出し
  • glClear に深度バッファ ビットを追加するglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  • z 座標を正射行列のニア値とファー値の間に定義します。
于 2012-04-03T04:41:59.547 に答える