关于基于立方体的体素引擎中的OpenGL(剔除和优化)的几个问题

时间:2013-05-18 19:53:49

标签: java opengl lwjgl

我正在使用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);但它给了我这个作为回报,它似乎剔除了正面而不是背面:

Culling Enabled

Culling Disabled

这是通过glEnable启用剔除,我的剔除也被禁用(因为列表没有意义)。这看起来很好,但我相信,性能可以大大提高。

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

编辑:我甚至复制了一些其他代码来绘制一个立方体,但在启用剔除的情况下仍然看起来不正确。

2 个答案:

答案 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)来改变哪个绕线顺序被认为是正面的。