2014-06-12 146 views
0

我想在Java中使用opengl實現一個體素引擎。當我嘗試在屏幕上渲染一個體素塊時,會產生一些單純的噪音以產生地形,這看起來是顛倒的。我假設這是因爲我是通過我的循環來生成它。體素塊渲染顛倒

for (int x = 0; x < CHUNK_SIZE; x++) { 
     for (int z = 0; z < CHUNK_SIZE; z++) { 
      int height = (int)(sno.noise(x/16f, z/16f)*Math.random()*16); 
      if(height <= 0) 
       height = 1; 
      for (int y = 0; y < height; y++) { 
       blocks[x][y][z].setActive(true); 
       activateBlocks += 1; 
      } 
     } 
    } 
} 

public void drawChunk() { 
     GL11.glPushMatrix(); 
     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle); 
     GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); 

     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOTextureHandle); 
     GL11.glColorPointer(3, GL11.GL_FLOAT, 0, 0L); 


     GL11.glDrawArrays(GL11.GL_QUADS, 0, ((24)*activateBlocks)); 
     GL11.glPopMatrix(); 
} 

public void putVertices(float tx, float ty, float tz) { 
    float l_length = 1.0f; 
    float l_height = 1.0f; 
    float l_width = 1.0f; 
    vertexPositionData.put(new float[]{ 
      xOffset + l_length + tx, l_height + ty, zOffset + -l_width + tz, 
      xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz, 
      xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz, 
      xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz, 

      xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz, 
      xOffset + -l_length + tx, -l_height + ty, zOffset + l_width + tz, 
      xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz, 
      xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz, 

      xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz, 
      xOffset + -l_length + tx, l_height + ty,zOffset + l_width + tz, 
      xOffset + -l_length + tx, -l_height + ty,zOffset + l_width + tz, 
      xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz, 

      xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz, 
      xOffset + -l_length + tx, -l_height + ty,zOffset + -l_width + tz, 
      xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz, 
      xOffset + l_length + tx, l_height + ty, zOffset + -l_width + tz, 

      xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz, 
      xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz, 
      xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz, 
      xOffset + -l_length + tx, -l_height + ty,zOffset + l_width + tz, 

      xOffset + l_length + tx, l_height + ty,zOffset + -l_width + tz, 
      xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz, 
      xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz, 
      xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz 

    }); 
} 

public void createChunk() { 
    vertexPositionData = BufferUtils.createFloatBuffer(((24*3)*activateBlocks)); 

    Random random = new Random(); 
    for (int x = 0; x < CHUNK_SIZE; x++) { 
     for (int z = 0; z < CHUNK_SIZE; z++) { 
      for (int y = 0; y < CHUNK_SIZE; y++) { 
       if(blocks[x][y][z].getActive()) { 
        putVertices(x*2, y*2, z*2); 
       } 
      } 
     } 
    } 

    vertexPositionData.flip(); 

} 

任何想法?

這裏是什麼樣子的遊戲 -

Chunk upside down

+0

我實際上看不到圖像,但如果它顛倒了,請嘗試翻轉座標。 –

+0

什麼是你的變換矩陣? –

回答

0

沒有看到你的渲染代碼,這是很難確定的,但我敢打賭很多錢,你已經忘記了是Y在Java中的座標開始在屏幕的頂部,然後往下走。

+0

我已將渲染代碼添加到我的文章。我認爲你是對的。 – sunsunsunsunsun

+0

該問題已通過更改putVertices(x * 2,y * 2,z * 2)來解決; putVertices(x * 2,-y * 2,z * 2); – sunsunsunsunsun

+0

-1:OpenGL座標來自左下角。 Java用作座標的東西是無關緊要的。 –