在我的体素引擎中,现在我正在尝试为块添加块,并且它正在半工作。它在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();
}
(我通过调用列表来渲染它)无论如何,它将块添加到块中,但是当我放置一个新块时它会删除旧块!我不知道它为什么会这样做,但是如果有人能帮助我那会很棒!
答案 0 :(得分:2)
好的,问题是:如何在显示列表中添加内容?
我将分两部分回答这个问题。首先,我通常会试图拒绝告诉人们他们不应该做他们想做的事情。但在这种情况下,我无法帮助它:不要使用显示列表!它们在2009年被正式废弃,恕我直言在此之前已经过时了大约10年。除非您必须维护无法轻易更改的遗留代码,否则您应该了解现代绘图方法。查找VBO(顶点缓冲区对象)和VAO(顶点数组对象)等关键字。
现在,让我们假设您真正依赖于显示列表,并且无论如何都想使用它们。您无法直接修改OpenGL中的显示列表。当您致电glNewList()
时,之前的内容将被删除。您可以根据自己的情况选择一些选项:
glNewList()
和glEndList()
之间的块中的所有可见块。glCallLists()
调用执行多个显示列表。 glCallLists()
采用一系列显示列表索引,因此您需要维护一个包含每个块的显示列表索引的数组。glCallList()
调用。如果每个块的块数存在上限,则可以构建此整体显示列表一次,并为每个可能的块调用glCallList()
,并保留每个块列表为空,直到相应的块变为可见。然后,要添加块,可以使用现在的调用序列填充每块列表。要渲染块,请使用整个显示列表调用glCallList()
。