0

我正在使用 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 启用剔除的情况下,我的剔除也被禁用(因为列表毫无意义)。一切看起来都很好,但我相信性能可以大大提高。

这是我的代码,如果我遗漏了什么,请询问,如果您需要,我可以上传整个项目:

编辑:我什至复制了一些其他代码来绘制一个立方体,但启用剔除后它看起来仍然不正确。

4

2 回答 2

2

起初 - 从你的描述

“仍然绘制不可见的面(块之间的面)”

似乎存在设计问题。是否有人脸应该取决于模型,而不是视图,而剔除是与视图相关的概念。


“如果我使用显示列表,则不会完全更新”

查看红皮书的“显示列表中存储的内容”一章。


“但它给了我这个回报,它似乎剔除了正面而不是背面:”

法线可能不适合多边形模式。

对于立方体,计算它们面的法线非常便宜:只需取立方体中心 cc_ 和面的中心 cf_ 然后(在伪代码中)

n_ = (cf_ - cc_);
n_ = normalize(n_);

产生一个向外指向的面法线。

于 2013-05-18T20:31:53.233 回答
0

避免在块之间绘制面是您必须自己做的事情:仅当该方向上的相邻单元格为空时才绘制面。

看起来您正在剔除错误的一组面孔。剔除哪些面取决于顶点在转换到屏幕空间后的缠绕顺序(顺时针或逆时针)。

哪种脸被认为是正面的,由调用glFrontFace(GL_CW)或来确定glFrontFace(GL_CCW)GL_CCW是默认值。

颠倒您绘制面顶点的顺序或使用glFrontFace(GL_CW)glFrontFace(GL_CCW)更改被视为正面的缠绕顺序。

于 2013-05-20T16:36:49.950 回答