4

私は数日間JOGLを使用していますが、これが大きな障害になりつつあります。図形を正しい z オーダーで描画することができません。代わりに、OpenGL に指定された順序で図形が描画されます。

私はこれを調査するために過去数時間を費やしましたが、一般的な解決策 (および私の反応) は次のようです。

  • 視錐台が正しいことを確認してください

    • 錐台を再確認しましたが、正しいようです
    • カスタムビルドの錐台の代わりに gluLookAt に切り替えました
    • 問題がパースペクティブではないことを確認するためだけに、glOrthof に切り替えました。
    • 私はまったくビューを設定していません。代わりに、デフォルトと思われる-1、1の範囲で作業しています
  • 次の呼び出しが init にあることを確認します。

    • gl.glEnable(GL.GL_DEPTH_TEST);
    • gl.glDepthFunc(GL.GL_LEQUAL);
  • 再描画のたびに深度バッファをクリアしていることを確認してください

    • gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

この問題が発生しているプログラムの非常に基本的なサンプルを以下に示します。JOGL を使用して実行すると、Z 位置 -0.5f にある赤い三角形が常に一番上に表示され、三角形は互いに回転します。2 つの三角形の頂点呼び出しを入れ替えると、緑色の三角形が常に上になります。

これは私にとって大きな頭痛の種だったので、JOGL や OpenGL の一般的な洞察は役に立ちますが、何が間違っているのかわかりません。

また、簡潔にするために、ウィンドウを破棄するための適切なコードを削除したことに注意してください。

import java.awt.Frame;

import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import com.jogamp.opengl.util.Animator;


public class JOGLTest implements GLEventListener
{
    static GLU glu = new GLU();
    static GLCanvas canvas = new GLCanvas();
    static Frame frame = new Frame("JOGL test");
    static Animator animator = new Animator(canvas);

    float rot = 0.0f;

    public void display(GLAutoDrawable glDrawable)
    {
        final GL2 gl = glDrawable.getGL().getGL2();

        rot++;

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();

        gl.glRotatef(rot, 0.0f, 1.0f, 0.0f);

        gl.glBegin(GL.GL_TRIANGLES);

        gl.glColor3f(0.0f, 1.0f, 0.0f);
        gl.glVertex3f(0.0f, 1.0f, 0.0f);
        gl.glVertex3f(-1.0f, -1.0f, 0.0f);
        gl.glVertex3f(1.0f, -1.0f, 0.0f);

        gl.glColor3f(1.0f, 0.0f, 0.0f);
        gl.glVertex3f(-1.0f, 1.0f, -0.5f);
        gl.glVertex3f(1.0f, 1.0f, -0.5f);
        gl.glVertex3f(0.0f, 0.0f, -0.5f);

        gl.glEnd();
    }

    public void dispose(GLAutoDrawable arg0)
    {

    }

    public void init(GLAutoDrawable glDrawable)
    {
        GL2 gl = glDrawable.getGL().getGL2();
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        gl.glClearDepth(1.0f);
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glDepthFunc(GL.GL_LEQUAL);
    }

    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,
            int arg4)
    {

    }

    public static void main(String[] args)
    {
        canvas.addGLEventListener(new JOGLTest());
        frame.add(canvas);
        frame.setSize(640, 480);
        frame.setVisible(true);

        animator.start();
        canvas.requestFocus();
    }
}
4

3 に答える 3

3

よく考えて問題を解決しました。

GLCapabilities オブジェクトを作成し、GLCanvas の作成中に深度バッファーのビット数を手動で設定しました。コードは次のとおりです。

GLProfile glp = GLProfile.getDefault();
GLCapabilities caps = new GLCapabilities(glp);

caps.setDepthBits(16);
canvas = new GLCanvas(caps);
于 2010-11-30T14:34:47.163 に答える
0

たまたまあなたの質問に出くわしました... Intel グラフィックス カードと「古い」(11 月 24 日より前の) バージョンの JOGL を使用していますか? もしそうなら、以下が役に立つかもしれません (win7 64 ビットについての言及は無視してください。説明されている問題はより一般的であり、その後の JOGL リリースでそのインスタンスで解決されました): http://jogamp.762907.n3.nabble.com/ Depth-buffer-not-working-on-Win7-64b-td1737435.html

于 2010-12-20T21:29:42.460 に答える
0

同じ問題が発生しましたが、@david とは異なり、GLData で depthSize を設定しただけです。

GLData data = new GLData ();
data.depthSize = 24; 

#jogl #Linux

于 2021-08-01T01:23:15.843 に答える