我正在使用 LWJGL 创建一个类似 Minecraft 的体素引擎,但我在优化方面遇到了一些困难。现在,显然剔除可能会对性能产生很大的积极影响,因此为了进行背面剔除,我做了这样的事情:
if (chunk.getWorld().getGame().cam.getZ() >= zz)
{
glTexCoord2f(1, 1);
glVertex3f(1, 1, 0);
glTexCoord2f(0, 1);
glVertex3f(0, 1, 0);
glTexCoord2f(0, 0);
glVertex3f(0, 0, 0);
glTexCoord2f(1, 0);
glVertex3f(1, 0, 0);
}
它工作得很好,直到我遇到了一些问题。仍然会绘制不可见的面( block 之间的面),如果我使用显示列表,这不会完全更新。这是我的问题,如何剔除显示列表?我尝试做 glEnable(GL11.GL_CULL_FACE);但它给了我这个返回,它似乎剔除了正面而不是背面:
这没有通过 glEnable 启用剔除,我的剔除也被禁用(因为对于列表来说这是毫无意义的)。一切看起来都不错,但我相信性能可以大大提高。
这是我的代码,如果我遗漏了什么请询问,如果您需要,我可以上传整个项目:
编辑:我什至复制了一些其他代码来绘制立方体,但启用剔除后它看起来仍然不正确。
最佳答案
首先 - 根据您的描述
“仍然绘制不可见的面( block 之间的面)”
似乎存在设计问题。 有没有脸应该取决于模型,而不是 View ,而剔除是与 View 相关的概念。
<小时/>“如果我使用显示列表,则不会完全更新”
查看红皮书的“显示列表中存储的内容”一章。
<小时/>“但它给了我这个作为返回,它似乎剔除了正面而不是背面:”
法线可能不适合多边形模式。
对于立方体,计算其面的法线非常便宜:只需获取立方体中心 cc_ 和面的中心 cf_ (伪代码)
n_ = (cf_ - cc_);
n_ = normalize(n_);
产生一个向外的法线面。
关于java - 关于基于立方体的体素引擎中的 OpenGL(剔除和优化)的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628387/