我正在创建体素引擎。除了一些简单的单工噪声集成之外,我还创建了块生成,但是由于绘制了每个四边形的所有面,甚至看不到它们,所以它非常耗时。
以我的理解,这通常是通过使用射线投射来解决的,而射线投射是我理解的基本理论:您从照相机中汲取几条射线并检查是否发生碰撞,如果未发现碰撞,则该面部不在视野内,因此不应渲染该面部。即使我了解它的理论,由于缺乏先验知识以及我在互联网上发现的东西(即他们给出的是代码,但没有提供知识),我仍无法实现它。
我可以想象我需要采取的步骤如下:
了解OpenCL(尽管我之前从未使用过它,但据我了解,它使您可以通过使用“内核”更好地使用图形卡,而我在心理上与OpenGL“着色器”相关联)。
学习射线投射背后的理论和数学。我也听说过射线追踪,我相信它有不同的用途。
了解如何使用此信息不渲染隐藏的面孔。假设我有一个可行的实现,我将如何告诉OpenGL不要渲染隐藏的面孔?多维数据集是一个对象,据我所知,在OpenGL中,仅顶点是无法操作对象的面的。另外,OpenCL将如何与OpenGL通信? OpenCL不是图形API,因此它无法绘制光线。
有人能指出我正确的方向吗?我也相信也有纯OpenGL实现,但我想保留OpenCL方面,因为这是一种学习经验。
最佳答案
学习OpenCL(尽管我之前从未使用过它)
可以让您更好地利用图形卡
我在精神上与OpenGL``着色器''相关联的``内核'')。
Amd app sdk提供了许多示例/示例,从排序数字到在茶壶上进行3d流体计算。您也可以将cpu与opencl一起使用,但是可以将多个cpus视为单个设备。 Nvidia,jocl和lwjgl也有样品正在等待reverese设计。
学习射线投射背后的理论和数学。我也听说过
我相信射线追踪有不同的用途
我只知道,如果这些射线投射出新的射线,射线投射就会成为跟踪。许多矢量代数,例如叉积,点积,方向向量的归一化,3x3 4x4矩阵乘法等等。高阶递归对gpu不利。尝试使用迭代版本。
了解如何使用此信息不渲染隐藏的面孔。
您可以对光线相交的表面图元的距离进行排序,并获得最小的距离。如果该表面上没有折射,则不应看到其他物体。使用加速结构(有限的药丸层次,..)会有所帮助。
多维数据集是一个对象,据我所知,这是不可能的
仅在OpenGL中操纵对象的面。
在opencl中生成,将其传递给opengl,比立即模式更快。
另外,OpenCL将如何与OpenGL通信? OpenCL不是图形
api,因此无法绘制光线。
创建具有“共享”属性的上下文,以便能够使用gl-cl“ interop”。这使opencl-opengl通信可以与gpu-vram一样快(高端为300 GB / s)。然后在此上下文中使用gl缓冲区作为cl缓冲区,并在cl和gl之间进行适当的同步。(glFinish()compute()clFinish()drawArrays())
如果不是互操作,则通信速度将与pci-e带宽一样慢。如果计算数据比率低,则从cpu生成将变得更快。
如果要使用多个GPU,则应将数据打包得尽可能短。检查字节序,结构对齐。如果主机端有opencl(device)端结构,并且必须与1-1兼容,请不要忘记定义它们。
关于java - 射线转换以避免绘制看不见的面孔,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29710764/