2015-04-17 45 views
0

我正在创建一个体素引擎。除了一些简单的单纯噪声集成之外,我还创建了块生成,但由于每个四边形的所有面都被绘制,即使是您看不到的面,也非常滞后。光线投射,以避免绘制看不见的面孔

根据我的理解,这通常是使用光线投射处理的,其中我了解基本理论:从相机中画出若干光线并检查碰撞,如果未发现碰撞,则脸部不在视线内,因此应该不被渲染。即使我理解了它的理论,但由于缺乏先验知识以及我在互联网上发现的缺乏知识,所以我还没有能够实现它,即它们给出了代码而不是知识。

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

  1. 了解OpenCL的(虽然我以前没有使用过它我的理解它可以让你通过更好地利用你的显卡使用我在心智上与OpenGL着色器关联的'内核')。
  2. 了解光线投射背后的理论和数学。我也听说过我认为具有不同用途的光线追踪。
  3. 了解如何使用此信息不呈现隐藏的面孔。假设我得到了一个工作实现,我该如何去告诉OpenGL不要渲染隐藏的面部?立方体是一个对象,据我所知,没有办法在OpenGL中只操作顶点的对象的面。 OpenCL如何与OpenGL进行通信? OpenCL不是图形api,因此它不能绘制光线。

任何人都可以指向正确的方向吗?我也相信也有纯粹的OpenGL实现,但我想保留OpenCL方面,因为这是一种学习体验。

+0

在此期间,我想我可以开始在GUI上工作 – SemperAmbroscus

回答

0

了解OpenCL的(虽然我以前没有使用过它我的理解它 允许您通过使用 “仁”,我精神上支持OpenGL“着色”关联更好地利用你的显卡) 。

Amd app sdk有很多从数字排序到在茶壶上进行3D流体计算的例子/样本。你也可以在opencl中使用cpu,但多个cpus可以被看作是单个设备。此外,Nvidia和jocl以及lwjgl都有样品正在等待受到精心设计。

了解光线投射背后的理论和数学。我也听说过光线跟踪,我相信有一个不同的使用

我只知道光线投射成为跟踪,如果这些射线投新线的 。大量的矢量代数,如交叉积,点积,方向向量归一化,3x3 4x4矩阵乘法等等。更高阶的递归性对gpu是不利的。尝试使用迭代版本。

了解如何使用此信息不呈现隐藏的面孔。

您可以排序光线相交并获得最小距离之一的表面图元的距离。如果在这个表面上没有折射,别人就不应该被看到。使用加速结构(有界的bolume层次结构,..)会有所帮助。

立方体是一个对象,并给我所知,没有办法 操纵对象的面孔在OpenGL只有顶点。

在opencl中生成,将它传递给opengl,比立即模式更快。

另外OpenCL将如何与OpenGL进行通信? OpenCL不是图形 api,所以它不能绘制光线。

使用“共享”属性创建上下文以便能够使用gl -cl“interop”。这使opencl-opengl通信可以达到gpu-vram(高端为300 GB/s)。 (glFinish()compute()clFinish()drawArrays())

如果不是互操作,那么通信将会像pci- e带宽。然后,如果计算与数据比率较低,则从cpu生成的速度会更快。

如果有多个gpus可以玩,那么你应该打包尽可能短的数据。检查结构的排列顺序。如果在主机端有任何东西,不要忘记定义opencl(设备)侧结构,它们必须是1-1兼容的。

+0

谢谢,这让我有很多继续! – SemperAmbroscus

1

我不会推荐使用OpenCL或OpenGL开发你的第一款游戏,它们都会让你放慢速度,因为它们都需要不同的思维方式。 虽然尽可能地做到尽善尽美。

你提到你现在正在渲染所有四边形,你想删除隐藏的四边形。我也写过一个体素引擎来练习这个问题,并且花了很多时间思考如何解决这个问题。我的解决方案是不要画面临另一个体素。
想象两个彼此相邻的体素,触摸的两个面不能被看到,并且不需要被渲染。

但是,如果您与GPU交谈的方法是瓶颈,这并没有什么区别。你将不得不使用缓冲方法,我使用了显示列表,但它也有可能(但更难)使用VBOs。

我也建议将大量的体素分组为大块的原因很多。然后,您只需重新计算更改的块上可见的四边形。

关于射线铸造,如果您采用我刚描述的块系统,计算可见的整个卡盘将会更容易。 E.g播放器后面的块不需要渲染,并且可以通过每个块的一个点积计算来计算。

+0

我已经创建了一个块系统,但我一直在计算摄像头的当前位置并在其周围渲染指定数量的块。每帧的计算速度是否比你的方法慢?另外我同意,这是我主要关心的问题之一。 – SemperAmbroscus

+0

我完全忽略了这样的事实,即我为每个立方体使用单个vbo ... – SemperAmbroscus

+0

我不知道您计算相机位置的含义。如果您不像我描述的那样渲染隐藏的面,并且在每个卡盘上使用VBO或显示列表,并且只渲染距离和角度特定的卡盘,以获得您想要的性能。 –