我正在使用LWJGL创建Minecraft之类的Voxel引擎,但是在进行优化时遇到了一些困难。现在,明显的剔除可能会对性能产生很大的积极影响,因此要进行背面剔除,我做了如下操作:
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);但它给了我回报,似乎是在剔除正面而不是背面:
Culling Enabled
Culling Disabled
这是通过glEnable启用了剔除,我的剔除也被禁用了(因为列表是没有意义的)。一切看起来都不错,但是我相信性能可以大大提高。
这是我的代码,如果我缺少什么,请询问,如果您需要,我可以上传整个项目:
编辑:我什至复制了一些其他代码来绘制一个多维数据集,并且启用了剔除功能仍然看起来不正确。
最佳答案
首先-根据您的描述
“仍然绘制不可见的面(块之间的面)”
似乎存在设计问题。
是否有面孔应该取决于模型,而不取决于视图,而剔除是与视图相关的概念。
“如果使用显示列表,则不会完全更新”
查看红皮书的“显示列表中存储了什么”一章。
“但这给了我回报,似乎是在剔除正面而不是背面:”
法线可能不适合多边形模式。
对于多维数据集,计算其面的法线非常便宜:只需将多维数据集的中心cc_和面的中心cf_取为(用伪代码)
n_ = (cf_ - cc_);
n_ = normalize(n_);
产生指向外部的法线。