java - 光线转换以避免绘制看不见的面孔

标签 java opengl opencl lwjgl raycasting

我正在创建一个体素引擎。除了一些简单的单纯形噪声集成之外,我还创建了 block 生成,但由于每个四边形的所有面都被绘制,甚至是您看不到的面,所以它非常滞后。

据我了解,这通常是使用光线转换来处理的,我了解光线转换的基本理论:您从相机中绘制几条光线并检查碰撞,如果没有发现碰撞,则面部不在视野内,因此不应被渲染。尽管我了解这一切的理论,但由于缺乏先验知识以及我在互联网上发现的知识的缺乏,我还无法实现它,即他们提供了代码,但没有提供知识。

我可以想象我需要采取的步骤如下:

  1. 学习 OpenCL(虽然我以前没有使用过它,但据我了解,它可以让您通过使用“内核”更好地利用您的显卡,我在心理上将“内核”与 OpenGL“着色器”联系在一起)。
  2. 了解光线转换背后的理论和数学。我也听说过光线追踪,我相信它有不同的用途。
  3. 了解如何使用此信息来不渲染隐藏的面孔。假设我得到了一个有效的实现,我将如何告诉 OpenGL 不要渲染隐藏的面?立方体是一个对象,据我所知,在 OpenGL 中无法仅操纵对象的顶点来操纵对象的面。另外,OpenCL 如何与 OpenGL 进行通信? OpenCL 不是图形 API,因此它无法绘制光线。

有人能给我指出正确的方向吗?我还相信也有纯 OpenGL 实现,但我想保留 OpenCL 方面,因为这是一种学习体验。

最佳答案

我不建议在开发您的第一个游戏时使用 OpenCL 或 OpenGL,这两种方式都会大大减慢您的速度,因为每种方式都需要不同的思维方式。 干得好,虽然已经达到你所拥有的程度。

您提到您当前一直在渲染所有四边形,并且想要删除隐藏的四边形。我也编写了一个体素引擎用于练习,并遇到了这个问题,并花了很多时间思考如何解决它。我的解决方案是不绘制面向另一个体素的面。
想象一下两个体素彼此相邻,接触的两个面看不到并且不需要渲染。

但是,如果您与 GPU 通信的方法是瓶颈,那么这不会产生任何影响。您必须使用缓冲方法,我使用了显示列表,但也可以(但更难)使用 VBO。

出于多种原因,我还建议将大量体素分组为 block 。然后你只需要重新计算发生变化的 block 上的可见四边形。

关于光线转换,如果采用我刚才描述的 block 系统,计算可见的整个卡盘会更容易。例如,玩家后面的 block 不需要渲染,并且可以通过每个 block 进行一次点积计算来计算。

关于java - 光线转换以避免绘制看不见的面孔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29710764/

相关文章:

java - 为什么focusLost之后会触发其他focusLost?

java - 将项目添加到 Android 中的 ListView 时应用程序崩溃

c++ - 简单的C++,Linux 的opengl 游戏引擎?

debugging - opengl调试,如何查看顶点着色器的结果

OpenCL 与 DirectCompute?

OpenCL 强制缓冲区留在 GPU 上

java - 提取整数的最右边的 N 位

java - 尝试使用 HTTPPost 和 HTTPGet 在 Android 中创建登录应用程序,但登录已停止

c - 使用 MinGW : Undefined reference to '_imp__glewExperimental.' 的 GLEW 问题

opencl - 设置(标量)内核参数 OpenCL 后值错误