gpt4 book ai didi

java - 将 block 添加到 block - Java OpenGL

转载 作者:行者123 更新时间:2023-12-02 05:41:13 25 4
gpt4 key购买 nike

在我的体素引擎中,现在我正在尝试将 block 添加到 block 中,但它只工作了一半。它是用 Java 和 OpenGL 编写的。无论如何,当我放置 block 时,我正在这样做:

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

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

 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();
}

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

最佳答案

好的,所以问题是:如何向显示列表添加内容?

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

现在,让我们假设您确实喜欢显示列表,并且无论如何都想使用它们。您无法直接修改 OpenGL 中的显示列表。当调用glNewList()时,之前的内容将被清除。针对您的情况,您有几种选择:

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

关于java - 将 block 添加到 block - Java OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24501859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com