2014-06-12 149 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用作坐标的东西是无关紧要的。 –