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

标签 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);
    }

它工作得很好,直到我遇到了一些问题。仍然会绘制不可见的面( block 之间的面),如果我使用显示列表,这不会完全更新。这是我的问题,如何剔除显示列表?我尝试做 glEnable(GL11.GL_CULL_FACE);但它给了我这个返回,它似乎剔除了正面而不是背面:

Culling Enabled

Culling Disabled

这没有通过 glEnable 启用剔除,我的剔除也被禁用(因为对于列表来说这是毫无意义的)。一切看起来都不错,但我相信性能可以大大提高。

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

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

最佳答案

首先 - 根据您的描述

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

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

<小时/>

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

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

<小时/>

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

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

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

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

产生一个向外的法线面。

关于java - 关于基于立方体的体素引擎中的 OpenGL(剔除和优化)的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16628387/

相关文章:

java - Android 中的 AsyncTask 循环

c++ - 使用 OpenCL 获取 OpenGL 缓冲区

c - OpenGL 在顶点着色器中找到 `in vec3 vert` 但不是 `in float val`

c++ - .exe 不会编译,但在 visual studio 中运行时会编译

java - 使用 lwjgl 让背景闪烁

java - Html 文档中的多行

java - 连接4 java win检查

java - JTextArea 打印对话框

java - 每帧渲染和更新图像的最佳方法?

java - glfwGetWindowSize 结果为 SIGSEGV (LWJGL)