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();
    }
}
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

刚刚偶然发现您的问题...您是否使用英特尔显卡和“旧”(11 月 24 日之前)版本的 JOGL,是否有机会?如果是这样,以下可能会有所帮助(忽略 win7 64 位的提及;所描述的问题更普遍,并且在随后的 JOGL 版本中在该实例中得到解决):http: //jogamp.762907.n3.nabble.com/深度缓冲区不工作在 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 回答