将块添加到块 - Java OpenGL

时间:2014-07-01 02:54:24

标签: java opengl 3d block voxel

在我的体素引擎中,现在我正在尝试为块添加块,并且它正在半工作。它在Java和OpenGL中。无论如何,当我放置块时,我正在这样做:

public void placeBlock(int x, int y, int z, Block block)
{
    // c = chunk
    c.addToChunk(x, y, z, block);
}

之后,在我的chunk类中我有这个方法:

 public void addToChunk(int x, int y, int z, Block block)
{
    glNewList(test, GL_COMPILE);
    glBegin(GL_QUADS);
    Shape.createCube(x, y, z, Block.getBlockById(block.getId()).getColor(), Block.getBlockById(block.getId()).getTexCoords(), 1);
    blocks[x][y][z] = block.getId();
    glEnd();
    glEndList();
}

(我通过调用列表来渲染它)无论如何,它将块添加到块中,但是当我放置一个新块时它会删除旧块!我不知道它为什么会这样做,但是如果有人能帮助我那会很棒!

1 个答案:

答案 0 :(得分:2)

好的,问题是:如何在显示列表中添加内容?

我将分两部分回答这个问题。首先,我通常会试图拒绝告诉人们他们不应该做他们想做的事情。但在这种情况下,我无法帮助它:不要使用显示列表!它们在2009年被正式废弃,恕我直言在此之前已经过时了大约10年。除非您必须维护无法轻易更改的遗留代码,否则您应该了解现代绘图方法。查找VBO(顶点缓冲区对象)和VAO(顶点数组对象)等关键字。

现在,让我们假设您真正依赖于显示列表,并且无论如何都想使用它们。您无法直接修改OpenGL中的显示列表。当您致电glNewList()时,之前的内容将被删除。您可以根据自己的情况选择一些选项:

  1. 将块添加到块时,重建块的整个显示列表。因此,您基本上可以执行现在的操作,但在将新块添加到列表后,迭代glNewList()glEndList()之间的块中的所有可见块。
  2. 将每个块保留在单独的显示列表中。您可以通过一次glCallLists()调用执行多个显示列表。 glCallLists()采用一系列显示列表索引,因此您需要维护一个包含每个块的显示列表索引的数组。
  3. 使用分层显示列表。使用这种方法,您可以获得每个块的显示列表,但是您还可以拥有整个块的整体显示列表,而这些列表又包含每个块的glCallList()调用。如果每个块的块数存在上限,则可以构建此整体显示列表一次,并为每个可能的块调用glCallList(),并保留每个块列表为空,直到相应的块变为可见。然后,要添加块,可以使用现在的调用序列填充每块列表。要渲染块,请使用整个显示列表调用glCallList()