2014-06-04 214 views
0

我似乎得到一些奇怪的問題,從一個旋轉的立方體的這個小演示裁剪:LWJGL立方演示奇怪的渲染

private static int x = 0; 

    public static void start(Demo lf) { 
     try { 
      Display.setDisplayMode(new DisplayMode(640,640)); 
      Display.setTitle("Cube Demo 3D"); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
     } 

     GL11.glMatrixMode(GL11.GL_PROJECTION); 
     GL11.glLoadIdentity(); 
     GL11.glOrtho(-5, 5, -5, 5, -1, 5); 
     GL11.glMatrixMode(GL11.GL_MODELVIEW); 
     while (!Display.isCloseRequested()) { 
      Display.sync(60); 
      CubeRenderer.render(lf); 
     } 

     Display.destroy(); 
    } 

    public static void render(Demo lf) { 
     GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT|GL11.GL_COLOR_BUFFER_BIT); 
     GL11.glEnable(GL11.GL_CULL_FACE); 
     GL11.glEnable(GL11.GL_DEPTH_TEST); 
     GL11.glColor3f(1, 0, 0); 

     GL11.glRotatef(x++, 1, 1, 1); 

     GL11.glBegin(GL11.GL_QUADS); 
     GL11.glColor3f(1.0f,1.0f,1.0f); 
     GL11.glVertex3f(1.0f, 1.0f,-1.0f); 
     GL11.glVertex3f(-1.0f, 1.0f,-1.0f); 
     GL11.glVertex3f(-1.0f, 1.0f, 1.0f); 
     GL11.glVertex3f(1.0f, 1.0f, 1.0f); 
     GL11.glColor3f(1.0f,1.0f,1.0f); 
     GL11.glVertex3f(1.0f,-1.0f, 1.0f); 
     GL11.glVertex3f(-1.0f,-1.0f, 1.0f); 
     GL11.glVertex3f(-1.0f,-1.0f,-1.0f); 
     GL11.glVertex3f(1.0f,-1.0f,-1.0f); 
     GL11.glColor3f(1.0f,1.0f,1.0f); 
     GL11.glVertex3f(1.0f, 1.0f, 1.0f); 
     GL11.glVertex3f(-1.0f, 1.0f, 1.0f); 
     GL11.glVertex3f(-1.0f,-1.0f, 1.0f); 
     GL11.glVertex3f(1.0f,-1.0f, 1.0f); 
     GL11.glColor3f(1.0f,1.0f,1.0f); 
     GL11.glVertex3f(1.0f,-1.0f,-1.0f); 
     GL11.glVertex3f(-1.0f,-1.0f,-1.0f); 
     GL11.glVertex3f(-1.0f, 1.0f,-1.0f); 
     GL11.glVertex3f(1.0f, 1.0f,-1.0f); 
     GL11.glColor3f(1.0f,1.0f,1.0f); 
     GL11.glVertex3f(-1.0f, 1.0f, 1.0f); 
     GL11.glVertex3f(-1.0f, 1.0f,-1.0f); 
     GL11.glVertex3f(-1.0f,-1.0f,-1.0f); 
     GL11.glVertex3f(-1.0f,-1.0f, 1.0f); 
     GL11.glColor3f(1.0f,1.0f,1.0f); 
     GL11.glVertex3f(1.0f, 1.0f,-1.0f); 
     GL11.glVertex3f(1.0f, 1.0f, 1.0f); 
     GL11.glVertex3f(1.0f,-1.0f, 1.0f); 
     GL11.glVertex3f(1.0f,-1.0f,-1.0f); 
     GL11.glEnd(); 

     GL11.glLoadIdentity(); 
     Display.update(); 

    } 

    public static void main(String argv[]) { 
     Demo lf = new Demo(100); 
     lf.step(); 
     CubeRenderer.start(lf); 
    } 
} 

這裏的結果的畫面:

Problems with clipping

它看起來像立方體旋轉時立方體的正面偶爾會變得不可見,顯示一個黑色的三角形。

回答

1

你的正投影矩陣切斷立方體的一部分:

GL11.glOrtho(-5, 5, -5, 5, -1, 5); 

近平面是在-1。但是,當你旋轉一個單位立方體時,變換曲面上的某些點將比-1更接近。光柵化器將刪除延伸超出近平面的幾何體部分。

由於您開啓了臉部剔除功能,因此您沒有看到通過立方體的後向三角形。如果您爲立方體的每個面分配不同的顏色並關閉面部剔除,效果會更加明顯。然後,您可以通過創建的孔洞看到立方體的相反兩側。

嘗試將您的近平面設置爲-5,或嘗試減小立方體的大小。

另外,我建議你避免Display.sync(),並在初始化時簡單地使用Display.setVSyncEnabled(true)來控制幀速率。

+0

謝謝!我沒有注意到立方體的一部分正在通過近平面。 – AnimatedRNG