JOGL深度缓冲不起作用

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始终在顶部,而三角形在彼此旋转。如果你交换两个三角形的顶点调用,绿色三角形将始终在顶部。

这对我来说是一个巨大的头痛,所以任何见解都将有所帮助,无论是来自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();
    }
}

我将完全相同的OpenGL代码编写到Windows应用程序中,并且它可以很好地工作。这让我认为Java窗口设置有问题,或者是我所使用的JOGL版本存在问题。你有什么建议吗? - David Bella
3个回答

3

经过深思熟虑,我解决了这个问题。

在创建GLCanvas时,我创建了一个GLCapabilities对象,并手动设置了深度缓冲区的位数。代码如下:

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

caps.setDepthBits(16);
canvas = new GLCanvas(caps);

0

0

遇到了同样的问题,但不像@david那样,我只是在GLData中设置了depthSize:

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

#jogl #linux


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接