2010-11-28 48 views
2

我一直在使用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(); 
    } 
} 
+0

我寫完全相同的OpenGL代碼成使用OpenGL的Windows應用程序,它工作正常。這導致我相信Java窗口的設置有問題,或者我有JOGL的構建問題。任何輸入? – 2010-11-29 21:10:39

回答

2

我已經解決了這個問題,經過多次審議。

我創建了GLCapabilities對象,並在創建GLCanvas時手動設置深度緩衝區的位數。代碼如下:

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

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