Буферизация глубины JOGL не работает - PullRequest
2 голосов
/ 29 ноября 2010

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

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

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

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

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

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

caps.setDepthBits(16);
canvas = new GLCanvas(caps);
0 голосов
/ 21 декабря 2010

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

...