我已经使用JOGL几天了,这现在正成为一个主要的障碍。我不能让形状以正确的z顺序绘制,相反,它们是按照给予OpenGL的顺序绘制的。
我花了最后几个小时研究这个,一般的决议(以及我的反应)似乎如下:
确保你的视锥体是正确的
确保以下调用在init中:
确保在每次重绘时清除深度缓冲区
我已经提供了下面发生此问题的程序的基本示例。如果你有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();
}
}
答案 0 :(得分:2)
我已经过多考虑解决了这个问题。
我创建了一个GLCapabilities对象,并在创建GLCanvas时手动设置深度缓冲区的位数。代码如下:
GLProfile glp = GLProfile.getDefault();
GLCapabilities caps = new GLCapabilities(glp);
caps.setDepthBits(16);
canvas = new GLCanvas(caps);
答案 1 :(得分:0)
偶然发现了你的问题......你是不是有机会使用英特尔显卡和“旧版”(11月24日前)的JOGL版本?如果是这样,以下内容可能会有所帮助(忽略提及win7 64位;所描述的问题更为通用,并在后续JOGL版本中的该实例中得到解决): http://jogamp.762907.n3.nabble.com/Depth-buffer-not-working-on-Win7-64b-td1737435.html
答案 2 :(得分:0)
遇到了同样的问题,但与@david 不同的是,我只是在 GLData 中设置了 depthSize:
GLData data = new GLData ();
data.depthSize = 24;
#jogl #linux