我正在使用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);
}
它可以正常工作,直到遇到一些问题。仍然绘制了不可见的面(块之间的面),如果我使用显示列表,则不会完全更新。这是我的问题,如何剔除显示列表?我试过做glEnable(GL11.GL_CULL_FACE);但它给了我这个作为回报,它似乎剔除了正面而不是背面:
这是通过glEnable启用剔除,我的剔除也被禁用(因为列表没有意义)。这看起来很好,但我相信,性能可以大大提高。
这是我的代码,如果我遗漏了什么请问,如果您需要,我可以上传整个项目:
编辑:我甚至复制了一些其他代码来绘制一个立方体,但在启用剔除的情况下仍然看起来不正确。
答案 0 :(得分:2)
首先 - 根据您的描述
“仍然绘制了不可见的面(块之间的面)”
看来存在设计问题。 是否有脸应该取决于模型,而不是取决于视图,而剔除是与视图相关的概念。
“并不完全更新”
请查看红皮书中“存储在显示列表中的内容”一章。
“但它给了我这个回报,它似乎剔除了正面而不是背面:”
可能法线不适合多边形模式。
对于立方体,计算其面部的法线非常便宜:只需取立方体中心cc_和面部的中心cf_(然后是伪代码)
n_ = (cf_ - cc_);
n_ = normalize(n_);
产生向外的指向面正常。
答案 1 :(得分:0)
避免在块之间绘制面部是您必须自己做的事情:如果该方向上的相邻单元格为空,则只绘制一个面。
看起来你正在剔除错误的一组面孔。剔除哪些面是由顶点(顺时针或逆时针)转换到屏幕空间后的缠绕顺序决定的。
通过调用glFrontFace(GL_CW)
或glFrontFace(GL_CCW)
来确定哪种面部被视为正面。 GL_CCW
是默认值。
要么颠倒你绘制面顶点的顺序,要么使用glFrontFace(GL_CW)
或glFrontFace(GL_CCW)
来改变哪个绕线顺序被认为是正面的。