2013-01-06 43 views
0

我正在使用LWJGL/Open GL繪製一個多維數據集。問題在於它不會以正確的順序繪製面,並且它不會將立方體渲染到正確的位置!這裏的Block.java:GL_QUADS渲染我不想要的圖像

  package src; 

import static org.lwjgl.opengl.GL11.GL_QUADS; 
import static org.lwjgl.opengl.GL11.glBegin; 
import static org.lwjgl.opengl.GL11.glColor3f; 
import static org.lwjgl.opengl.GL11.glTranslatef; 
import static org.lwjgl.opengl.GL11.glVertex3f; 

import static org.lwjgl.opengl.GL11.*; 

public class Block { 
    private float x; 
    private float y; 
    private float z; 
    private Chunk chunk; 

public Block(float arg1, float arg2, float arg3, Chunk arg4) { 
    x = arg1; 
    y = arg2; 
    z = arg3; 
    chunk = arg4; 
} 

public void renderBlock() { 

    // glTranslatef(0, 0, 0); 
    // Texture tx = 
    chunk.getWorld().getGame().getTexture(0).bind(); 
    glBegin(GL_QUADS); 
    { 
     // Top Face 
     glTexCoord2f(0, 0); 
     glVertex3f(x - 1, y + 1, z - 1); 
     glTexCoord2f(0, 1); 
     glVertex3f(x, y + 1, z - 1); 
     glTexCoord2f(1, 1); 
     glVertex3f(x, y + 1, z); 
     glTexCoord2f(1, 0); 
     glVertex3f(x - 1, y + 1, z); 

     // Bottom Face 
     glTexCoord2f(0, 0); 
     glVertex3f(x - 1, y, z - 1); 
     glTexCoord2f(0, 1); 
     glVertex3f(x, y, z - 1); 
     glTexCoord2f(1, 1); 
     glVertex3f(x, y, z); 
     glTexCoord2f(1, 0); 
     glVertex3f(x - 1, y, z); 

     // Front Face 
     glTexCoord2f(0, 0); 
     glVertex3f(x, y + 1, z - 1); 
     glTexCoord2f(0, 1); 
     glVertex3f(x, y, z - 1); 
     glTexCoord2f(1, 1); 
     glVertex3f(x, y, z); 
     glTexCoord2f(1, 0); 
     glVertex3f(x, y + 1, z); 

     // Back Face 
     glTexCoord2f(0, 0); 
     glVertex3f(x - 1, y + 1, z - 1); 
     glTexCoord2f(0, 1); 
     glVertex3f(x - 1, y, z - 1); 
     glTexCoord2f(1, 1); 
     glVertex3f(x - 1, y, z); 
     glTexCoord2f(1, 0); 
     glVertex3f(x - 1, y + 1, z); 

     // BackFace 
     glTexCoord2f(0, 0); 
     glVertex3f(x - 1, y + 1, z - 1); 
     glTexCoord2f(0, 1); 
     glVertex3f(x, y + 1, z - 1); 
     glTexCoord2f(1, 1); 
     glVertex3f(x, y, z - 1); 
     glTexCoord2f(1, 0); 
     glVertex3f(x - 1, y, z - 1); 

     // FrontFace 
     glTexCoord2f(0, 0); 
     glVertex3f(x - 1, y + 1, z); 
     glTexCoord2f(1, 0); 
     glVertex3f(x, y + 1, z); 
     glTexCoord2f(1, 1); 
     glVertex3f(x, y, z); 
     glTexCoord2f(0, 1); 
     glVertex3f(x - 1, y, z); 

    } 
    glEnd(); 

} 

public float getX() { 
    return x; 
} 

public float getY() { 
    return y; 
} 

public float getZ() { 
    return z; 
} 
} 

這是Render.java:

package src; 

import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; 
import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST; 
import static org.lwjgl.opengl.GL11.glClear; 
import static org.lwjgl.opengl.GL11.glEnable; 
import static org.lwjgl.opengl.GL11.glEnd; 
import static org.lwjgl.opengl.GL11.glLoadIdentity; 
import static org.lwjgl.opengl.GL11.glPopMatrix; 
import static org.lwjgl.opengl.GL11.glPushMatrix; 

import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Mouse; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

public class Render { 

Game game; 

public Render(Game arggame) { 
    game = arggame; 
} 

public void initDisplay() { 
    try { 
     Display.setDisplayMode(new DisplayMode(1280, 720)); 
     Display.create(); 
    } catch (LWJGLException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public void renderLoop() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    game.cam.useView(); 

    glPushMatrix(); 
    { 

     renderBlocks(game.world); 

     glEnd(); 
    } 
    glPopMatrix(); 
    Display.update(); 

} 

public void renderBlocks(World arg1world) { 
    for (int i = 0; i < 125; i++) { 
     if (arg1world.chunkIndex[i] != null) { 
      for (int j = 0; j < 32768; j++) { 
       if (arg1world.chunkIndex[i].blockIndex[j] != null) { 
        arg1world.chunkIndex[i].blockIndex[j].renderBlock(); 
       } 
      } 
     } 
    } 
} 
} 

塊似乎使2塊較低,則應該是,我認爲它可以通過編輯glVertex3f固定,但爲什麼它不會正確呈現,因爲它使用的是位置變量。 glTranslate只會讓一切變得更糟(做一些指數移位)。

回答

1

它似乎不像你使用的深度緩衝區。我不知道LWJGL的細節,但我期望看到在initDisplay()中創建深度緩衝區的某些選項,在某些地方啓用GL_DEPTH_TEST並將GL_DEPTH_BUFFER_BIT添加到glClear()。這應該照顧你的臉部順序問題。其他問題:你有一個雙glEnd()(renderLoop()中的一個)沒有相應的glBegin(),它不應該傷害,但如果你開始檢查它們,會導致glErrors(你應該) 。

您的glTranslatef()不應該做任何事情,因爲它是(0,0,0)。但是,如果您真的想要使用真實值,則需要在翻譯過的每個對象周圍(即在renderBlock()的開始/結尾處)執行glPushMatrix()/ glPopMatrix(),否則它們會累積起來。

您選擇的頂點座標有點奇怪。通常人們將原點放在物體的中心(即使用XYZ的+/- 1座標)或者在左下角(即使用0YZ座標)。這應該不成問題,但可能會導致一些意想不到的轉變。

+0

它已經工作了! –