gpt4 book ai didi

java - JOGL 深度缓冲不工作

转载 作者:行者123 更新时间:2023-11-30 09:52:16 30 4
gpt4 key购买 nike

我已经使用 JOGL 几天了,现在这已成为一个主要障碍。我无法让形状以正确的 z 顺序绘制,而是按照它们提供给 OpenGL 的顺序绘制。

我花了最后几个小时研究这个问题,一般的解决方案(和我的 react )似乎如下:

  • 确保你的视锥是正确的

    • 我仔细检查了截锥体,它似乎是正确的
    • 我已经切换到 gluLookAt 而不是自定义的平截头体
    • 我已经切换到 glOrthof 只是为了确保问题不是透视。
    • 我什至没有设置任何 View ,而是在似乎默认的 -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();
}
}

最佳答案

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

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

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

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

关于java - JOGL 深度缓冲不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299132/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com