光线投射以避免绘制看不见的面孔
Ray casting to avoid drawing unseen faces
我正在创建体素引擎。除了一些简单的单纯形噪声集成之外,我还创建了块生成,但是由于绘制了每个四边形的所有面,即使是您看不到的面,它也非常滞后。
据我所知,这通常是使用光线投射来处理的,我了解它的基本理论:从相机中提取几条光线并检查碰撞,如果没有发现碰撞,则面部不在视野范围内,因此不应该被渲染。尽管我了解这一切的理论,但由于缺乏先验知识以及我在互联网上发现的缺乏知识,我还无法实现它,即他们提供代码而不是知识。
我可以想象我需要采取的步骤如下:
- 学习 OpenCL(虽然我以前没有用过它,但据我所知,它可以让你更好地利用你的显卡,通过使用 'kernels' 我在脑海中联想到 OpenGL 'shaders' ).
- 了解光线投射背后的理论和数学。我也听说过光线追踪,我相信它有不同的用途。
- 了解如何使用此信息不渲染隐藏的面孔。假设我得到了一个有效的实现,我将如何告诉 OpenGL 不要渲染隐藏的面孔?立方体是一个对象,据我所知,在 OpenGL 中无法仅通过顶点来操纵对象的面。另外,OpenCL 将如何与 OpenGL 通信? OpenCL 不是图形 api,因此它无法绘制光线。
谁能指出我正确的方向?我也相信也有纯 OpenGL 实现,但我想保留 OpenCL 方面,因为这是一种学习经验。
我不建议您在开发第一款游戏时使用 OpenCL 或 OpenGL,这两种游戏都会极大地拖慢您的速度,因为每种游戏都需要不同的思维方式。
尽管尽你所能,但做得很好。
您提到您目前一直在渲染所有四边形,您希望移除隐藏的四边形。我也写了一个用于练习的体素引擎 运行 解决这个问题并花了很多时间思考如何解决它。我的解决方案是不绘制面向另一个体素的面孔。
想象两个相邻的体素,接触的两个面是看不见的,不需要渲染。
但是,如果您与 GPU 对话的方法是瓶颈,这不会有任何区别。您将不得不使用缓冲方法,我使用了显示列表,但也可以(但更难)使用 VBO。
出于多种原因,我还建议将大量体素分组。然后你只需要重新计算改变的块上的可见四边形。
关于Ray Casting,如果你采用我刚才描述的块系统,计算可见的整个卡盘会更容易。例如,玩家身后的区块不需要渲染,只需对每个区块进行一次点积计算即可计算出来。
Learn OpenCL (though I haven't used it before to my understanding it
allows you to better make use of your graphics card by the use of
'kernels' which I mentally associate with OpenGL 'shaders').
AMD 应用程序 sdk 有很多 examples/samples 从排序数字到在茶壶上进行 3d 流体计算。您也可以将 cpu 与 opencl 一起使用,但多个 cpu 可以被视为单个设备。 Nvidia、jocl 和 lwjgl 也有等待逆向工程的样本。
Learn the theory and math behind Ray casting. I have also have heard
of ray tracing which I believe has a different use
我只知道如果那些光线投射出新的光线,光线投射就会变成追踪。许多向量代数,如叉积、点积、方向向量的归一化、3x3 4x4 矩阵乘法等等。高阶递归对 gpu 不利。尝试迭代版本。
Learn how to use this information to not render hidden faces.
您可以对一条射线相交的表面图元的距离进行排序,并得到距离最小的一个。如果该表面没有折射,则不应看到其他人。使用加速结构(有界的 bolume 层次结构,..)有帮助。
The cube is one object and to the best of my knowledge there is no way
to manipulate the faces of an object in OpenGL only the vertices.
在opencl中生成,传递给opengl,比immediate模式更快。
Also how would OpenCL communicate with OpenGL? OpenCL isn't a graphics
api so it isn't capable of drawing the rays.
创建具有 "sharing" 属性的上下文,以便能够使用 gl-cl "interop"。这使 opencl-opengl 通信速度与 gpu-vram 一样快(高端为 300 GB/s)。然后在此上下文中使用 gl 缓冲区作为 cl 缓冲区,并在 cl 和 gl 之间进行适当的同步。(glFinish() compute() clFinish() drawArrays())
如果不是互操作,那么通信速度将与 pci-e 带宽一样慢。如果计算与数据的比率较低,则从 cpu 生成会变得更快。
如果有多个GPU一起玩,那么你应该尽可能短地打包你的数据。检查字节顺序,结构对齐。不要忘记定义 opencl(device)-side 结构,如果在主机端有的话,它们必须是 1-1 兼容的。
我正在创建体素引擎。除了一些简单的单纯形噪声集成之外,我还创建了块生成,但是由于绘制了每个四边形的所有面,即使是您看不到的面,它也非常滞后。
据我所知,这通常是使用光线投射来处理的,我了解它的基本理论:从相机中提取几条光线并检查碰撞,如果没有发现碰撞,则面部不在视野范围内,因此不应该被渲染。尽管我了解这一切的理论,但由于缺乏先验知识以及我在互联网上发现的缺乏知识,我还无法实现它,即他们提供代码而不是知识。
我可以想象我需要采取的步骤如下:
- 学习 OpenCL(虽然我以前没有用过它,但据我所知,它可以让你更好地利用你的显卡,通过使用 'kernels' 我在脑海中联想到 OpenGL 'shaders' ).
- 了解光线投射背后的理论和数学。我也听说过光线追踪,我相信它有不同的用途。
- 了解如何使用此信息不渲染隐藏的面孔。假设我得到了一个有效的实现,我将如何告诉 OpenGL 不要渲染隐藏的面孔?立方体是一个对象,据我所知,在 OpenGL 中无法仅通过顶点来操纵对象的面。另外,OpenCL 将如何与 OpenGL 通信? OpenCL 不是图形 api,因此它无法绘制光线。
谁能指出我正确的方向?我也相信也有纯 OpenGL 实现,但我想保留 OpenCL 方面,因为这是一种学习经验。
我不建议您在开发第一款游戏时使用 OpenCL 或 OpenGL,这两种游戏都会极大地拖慢您的速度,因为每种游戏都需要不同的思维方式。 尽管尽你所能,但做得很好。
您提到您目前一直在渲染所有四边形,您希望移除隐藏的四边形。我也写了一个用于练习的体素引擎 运行 解决这个问题并花了很多时间思考如何解决它。我的解决方案是不绘制面向另一个体素的面孔。
想象两个相邻的体素,接触的两个面是看不见的,不需要渲染。
但是,如果您与 GPU 对话的方法是瓶颈,这不会有任何区别。您将不得不使用缓冲方法,我使用了显示列表,但也可以(但更难)使用 VBO。
出于多种原因,我还建议将大量体素分组。然后你只需要重新计算改变的块上的可见四边形。
关于Ray Casting,如果你采用我刚才描述的块系统,计算可见的整个卡盘会更容易。例如,玩家身后的区块不需要渲染,只需对每个区块进行一次点积计算即可计算出来。
Learn OpenCL (though I haven't used it before to my understanding it allows you to better make use of your graphics card by the use of 'kernels' which I mentally associate with OpenGL 'shaders').
AMD 应用程序 sdk 有很多 examples/samples 从排序数字到在茶壶上进行 3d 流体计算。您也可以将 cpu 与 opencl 一起使用,但多个 cpu 可以被视为单个设备。 Nvidia、jocl 和 lwjgl 也有等待逆向工程的样本。
Learn the theory and math behind Ray casting. I have also have heard of ray tracing which I believe has a different use
我只知道如果那些光线投射出新的光线,光线投射就会变成追踪。许多向量代数,如叉积、点积、方向向量的归一化、3x3 4x4 矩阵乘法等等。高阶递归对 gpu 不利。尝试迭代版本。
Learn how to use this information to not render hidden faces.
您可以对一条射线相交的表面图元的距离进行排序,并得到距离最小的一个。如果该表面没有折射,则不应看到其他人。使用加速结构(有界的 bolume 层次结构,..)有帮助。
The cube is one object and to the best of my knowledge there is no way to manipulate the faces of an object in OpenGL only the vertices.
在opencl中生成,传递给opengl,比immediate模式更快。
Also how would OpenCL communicate with OpenGL? OpenCL isn't a graphics api so it isn't capable of drawing the rays.
创建具有 "sharing" 属性的上下文,以便能够使用 gl-cl "interop"。这使 opencl-opengl 通信速度与 gpu-vram 一样快(高端为 300 GB/s)。然后在此上下文中使用 gl 缓冲区作为 cl 缓冲区,并在 cl 和 gl 之间进行适当的同步。(glFinish() compute() clFinish() drawArrays())
如果不是互操作,那么通信速度将与 pci-e 带宽一样慢。如果计算与数据的比率较低,则从 cpu 生成会变得更快。
如果有多个GPU一起玩,那么你应该尽可能短地打包你的数据。检查字节顺序,结构对齐。不要忘记定义 opencl(device)-side 结构,如果在主机端有的话,它们必须是 1-1 兼容的。