我正在使用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_);


产生指向外部的法线。

10-04 20:22