我一直在使用JOGL幾天,現在這成爲一個主要的路障。我不能讓形狀繪製正確的z順序,而是按照它們賦予OpenGL的順序繪製。JOGL深度緩衝不工作
我已經花了幾個小時研究這個和一般的分辨率(和我的反應)似乎是以下幾點:
確保您的視錐是正確
- 我有雙檢查了平截頭體,看起來正確
- 我已經切換到gluLookAt而不是定製的平截頭體
- 我已經切換到glOrthof只是爲了mak確定這不是問題的視角。
- 我還沒有設置任何觀點可言,在這似乎是默認了-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代碼成使用OpenGL的Windows應用程序,它工作正常。這導致我相信Java窗口的設置有問題,或者我有JOGL的構建問題。任何輸入? – 2010-11-29 21:10:39