2010-11-28 2 views
2

저는 며칠 동안 JOGL을 사용해 왔으며 이제는 주요 도로 블록이되고 있습니다. 올바른 z- 순서로 그리는 도형을 얻을 수 없으며 OpenGL에 주어진 순서대로 그려집니다.JOGL 깊이 버퍼링이 작동하지 않습니다.

  • 것은 내가 두 번이

    • 당신의 절두체가 정확한지 확인하십시오

      내가이 일반 해상도 (내 반응을) 연구의 마지막 몇 시간을 보냈습니다

      다음과 같은 것 같다 절두체를 확인했는데 정확하다고 보겠습니다.

    • 사용자가 만든 절두체 대신 gluLookAt로 바 꾸었습니다.
    • 나는 단지 glOth로 전환했습니다. 그것이 문제라는 관점이 아니라는 것을 확신하십시오.
    • 이 난 대신 기본을 것으로 보인다 -1, 1 개 범위에서 작업, 전혀보기를 설정하지 않은
  • 다음 호출이 초기화에 있는지 확인 :

    • 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 응용 프로그램은 정상적으로 작동합니다.이것은 내가 자바 윈도우 잉에 대한 설정이나 내가 가지고있는 JOGL의 빌드에 문제가 있다고 생각하게한다. 어떤 입력? –

답변

2

많은 심의에서 문제를 해결했습니다.

나는 GLCapabilities 객체를 생성하고 GLCanvas를 생성하는 동안 깊이 버퍼의 비트 수를 수동으로 설정했습니다. 그냥 질문을 통해

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

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