Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于基于立方体的体素引擎中的OpenGL(剔除和优化)的几个问题_Java_Opengl_Lwjgl - Fatal编程技术网

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

Java 关于基于立方体的体素引擎中的OpenGL(剔除和优化)的几个问题,java,opengl,lwjgl,Java,Opengl,Lwjgl,我正在使用LWJGL创建一个类似于Minecraft的体素引擎,但在优化方面遇到了一些困难。现在,显然剔除可能会对性能产生巨大的积极影响,所以为了进行背面剔除,我做了如下操作: if (chunk.getWorld().getGame().cam.getZ() >= zz) { glTexCoord2f(1, 1); glVertex3f(1, 1, 0); glTexCoord2f(0, 1); glVer

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

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


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

起初-根据您的描述

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

似乎存在设计问题。 是否存在面应取决于模型,而不是视图,消隐是一个与视图相关的概念


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

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


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

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

对于立方体,计算其面的法线非常便宜:只需取立方体中心cc_u和面的中心cf_u(伪代码)


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

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

看起来你剔除了一组错误的面。剔除哪些面是由顶点变换到屏幕空间后的缠绕顺序(顺时针或逆时针)决定的

通过调用
glFrontFace(GL\u-CW)
glFrontFace(GL\u-CCW)
确定哪种面被视为正面<代码>总账CCW是默认值


可以反转绘制面顶点的顺序,或者使用
glFrontFace(GL_CW)
glFrontFace(GL_CCW)
来更改被视为正面的缠绕顺序。

-1,过度缩进。这不是一个模型,它是一组相邻渲染的立方体,什么红皮书?你能说得更具体一点吗?@NeHatchickVerma:“这不是一个模型,而是一堆相邻的立方体”构成了一个模型。glFrontFace(GL_CW)/glFrontFace(GL_CCW)给出了完全相同的结果,我确实停止了在块之间绘制面,我的多维数据集渲染代码应该是什么样子的?您确定得到完全相同的结果吗?如果面没有一致的绕组(从每个立方体的外部看),则GL_CW或GL_CCW都不会给出正确的结果,但它们应该有不同的错误。另一件事可以尝试是glCullFace与GL_FRONT或GL_BACK(尽管将其替换为GL_CCW的结果应该与将GL_CW替换为GL_CCW的结果相同)。
n_ = (cf_ - cc_);
n_ = normalize(n_);