Буферизация глубины JOGL не работает

Я использую JOGL уже несколько дней, и теперь это становится серьезным препятствием. Я не могу заставить фигуры рисовать в правильном z-порядке, вместо этого они рисуются в том порядке, в котором они заданы OpenGL.

Я провел последние несколько часов, исследуя это, и общие решения (и мои реакции), похоже, следующие:

  • Убедитесь, что ваша усеченная пирамида правильная

    • I have double checked the frustum, it seems correct
    • Я переключился на gluLookAt вместо пользовательского усеченного конуса.
    • Я переключился на glOrthof, чтобы убедиться, что проблема не в перспективе.
    • Я даже вообще не устанавливал ЛЮБОЕ представление, вместо этого работая в диапазоне -1, 1, который кажется по умолчанию.
  • Убедитесь, что в инициализации есть следующие вызовы:

    • 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 ВСЕГДА сверху, в то время как треугольники вращаются друг вокруг друга. Если вы поменяете местами вызовы двух вершин треугольника, зеленый треугольник всегда будет сверху.

Это было огромной головной болью для меня, поэтому любая информация будет полезна, будь то 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();
    }
}

person David Bella    schedule 28.11.2010    source источник
comment
Я написал точно такой же код OpenGL в приложении Windows, используя OpenGL, и он отлично работает. Это наводит меня на мысль, что что-то не так с настройкой окна Java или проблема со сборкой JOGL, которая у меня есть. Любой ввод?   -  person David Bella    schedule 30.11.2010


Ответы (2)


Я решил проблему после долгих размышлений.

Я создал объект GLCapabilities и вручную установил количество битов для буфера глубины при создании GLCanvas. Код выглядит следующим образом:

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

caps.setDepthBits(16);
canvas = new GLCanvas(caps);
person David Bella    schedule 30.11.2010

Только что наткнулся на ваш вопрос ... вы случайно не используете графическую карту Intel и «более старую» (до 24 ноября) версию JOGL? В этом случае может оказаться полезным следующее (не обращайте внимания на 64-разрядную версию Win7; описанная проблема носит более общий характер и в этом случае была решена в последующих выпусках JOGL): http://jogamp.762907.n3.nabble.com/Depth-buffer-not-working-on-Win7-64b-td1737435.html

person markm    schedule 20.12.2010