2014-04-17 53 views
2

我目前正在顯示列表中呈現三角形條,並顯示奇怪的小孔。Opengl三角形包含孔並消失有時

除此之外,一些看似三角形旋轉的環境時,就徹底消失了。
這裏是代碼:

public class Landscape { 

    int displayList; 

    public Landscape() throws IOException { 
     try { 
      Display.setDisplayMode(new DisplayMode(640, 480)); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
     } 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     GLU.gluPerspective(60f, 640f/480f, 0.0001f, 1000f); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 

     glEnable(GL_DEPTH_TEST); 
     glDepthFunc(GL_LEQUAL); 
     glPolygonMode(GL_FRONT_AND_BACK, GL_FLAT); 
     glEnable(GL_CULL_FACE); 

     BufferedImage heightMap = ImageIO.read(new File("heightmap.png")); 
     BufferedImage heightMapColor = ImageIO.read(new File("hoehenprofil.png")); 
     displayList = glGenLists(1); 
     glNewList(displayList, GL_COMPILE); 
     for (int z = 0; z < heightMap.getHeight(); z++) { 
      glBegin(GL_TRIANGLE_STRIP); 
      for (int x = 0; x < heightMap.getWidth(); x++) { 
       int y = 0xFF - heightMap.getRGB(x, z) & 0xFF; 
       int color = heightMapColor.getRGB(y-1, 0); 
       glColor3ub((byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF)); 
       glVertex3i(x, y*5, z); 
       if (z < heightMap.getHeight() - 1) { 
        y = 0xFF - heightMap.getRGB(x, z+1) & 0xFF; 
        color = heightMapColor.getRGB(y-1, 0); 
        glColor3ub((byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF)); 
        glVertex3i(x, y*5, z+1); 
       } 
      } 
      glEnd(); 
     } 
     glEndList(); 

     float camX = 500, camY = 500, camZ = -500; 
     float rotX = 45, rotY = 0, rotZ = 0; 
     long lastTick = System.currentTimeMillis(); 
     int fps = 0; 
     while (!Display.isCloseRequested()) { 
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
      glLoadIdentity(); 
      if (Keyboard.isKeyDown(Keyboard.KEY_W)) camZ++; 
      if (Keyboard.isKeyDown(Keyboard.KEY_S)) camZ--; 
      if (Keyboard.isKeyDown(Keyboard.KEY_A)) camX--; 
      if (Keyboard.isKeyDown(Keyboard.KEY_D)) camX++; 
      if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) camY++; 
      if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) camY--; 
      if (Keyboard.isKeyDown(Keyboard.KEY_Q)) rotY -= 0.5f; 
      if (Keyboard.isKeyDown(Keyboard.KEY_E)) rotY += 0.5f; 
      glRotatef(rotX, 1, 0, 0); 
      glRotatef(rotY, 0, 1, 0); 
      glRotatef(rotZ, 0, 0, 1); 
      glTranslatef(-camX, -camY, camZ); 
      glCallList(displayList); 
      Display.update(); 

      fps++; 
      if (lastTick + 1000 <= System.currentTimeMillis()) { 
       lastTick += 1000; 
       System.out.println("FPS: " + fps); 
       fps = 0; 
      } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     new Landscape(); 
    } 
} 

這似乎也出現禁用深度測試。即使啓用了剔除功能,這似乎也不起作用。

編輯:
除此之外,我得到一些黑色閃爍,只是在x或y軸周圍一定量的翻譯。這是一個截圖。

它會導致大量的滯後,我找不到任何理由。

EDIT2:
我縮放了x和z軸,並按照要求去除了屏幕截圖的y軸比例。它似乎只是在繞y軸伸展時導致錯誤。

+1

您是否在創建GL上下文時請求了深度緩衝區?如果你沒有明確要求,你可能得不到一個。 – genpfault

+0

我嘗試使用Display.create(new PixelFormat(1,1,1,4))請求深度緩衝區;它沒有改變任何東西。 – uwap

+0

你可以嘗試一下Y沒有縮放,然後在X/Z上縮放,就像我們可以用法語說的:「mettre leploblèmeàplat」,來獲得更容易理解的輸出。 –

回答

2

你在近平面和遠平面之間的區別(最後兩個參數爲gluPerspective)非常大。這兩者之間的相對大小(遠近分開)越大,您獲得的深度緩存精度就越低。在你的情況下,遠/近100萬,這比你通常想要的要多得多。我通常喜歡將它們保持在10左右的比例,儘管像100這樣的東西可能仍然很好。

調整這些值,同時確保您想要查看的幾何圖形都不會被剪切掉。試試像1.0和10.0。如果在遠端剪去幾何圖形,將遠端值增加到100.0之類,也許看看是否可以增加近端值。

+0

訣竅。謝謝。 – uwap

+0

我也是這樣的!感謝您的解釋! – user1118321