如何在现代OpenGL中进行光线跟踪?

如何在现代OpenGL中进行光线跟踪?,opengl,graphics,raytracing,opengl-3,Opengl,Graphics,Raytracing,Opengl 3,所以我现在应该开始给我的平板模型照明了。该测试应用程序是一个仅用于实现最新方法的测试用例,因此我意识到理想情况下它应该实现光线跟踪(因为从理论上讲,它可能在几年内非常适合实时图形) 但是我从哪里开始呢 假设我从未在旧的OpenGL中使用过照明,那么我将直接使用非弃用方法 该应用程序目前已正确设置顶点缓冲区对象、顶点、法线和颜色输入,并以平面颜色在空间中正确绘制和变换模型 是否有一个信息源可以通过GLSL将一个平面颜色的顶点转换为正确最终结果所需的所有顶点?理想情况下,使用任何其他可能需要补充的照

所以我现在应该开始给我的平板模型照明了。该测试应用程序是一个仅用于实现最新方法的测试用例,因此我意识到理想情况下它应该实现光线跟踪(因为从理论上讲,它可能在几年内非常适合实时图形)

但是我从哪里开始呢

假设我从未在旧的OpenGL中使用过照明,那么我将直接使用非弃用方法

该应用程序目前已正确设置顶点缓冲区对象、顶点、法线和颜色输入,并以平面颜色在空间中正确绘制和变换模型


是否有一个信息源可以通过GLSL将一个平面颜色的顶点转换为正确最终结果所需的所有顶点?理想情况下,使用任何其他可能需要补充的照明方法。

您可能会混淆一些事情

OpenGL是一个光栅化器。强制它进行光线跟踪是可能的,但很困难。这就是为什么光线跟踪“在几年内不适用于实时图形”。几年后,只有混合动力系统才可行

所以,你有三种可能

  • 纯光线追踪。仅渲染全屏四边形,并在片段着色器中,读取打包在缓冲区中的场景描述(如纹理),遍历层次,并计算光线三角形交点
  • 混合光线追踪。以常规方式栅格化场景,并在着色器中对场景中确实需要光线跟踪的某些部分使用光线跟踪(折射,…但可以在栅格化中模拟)
  • 纯光栅化。片段着色器执行其正常工作
你到底想要实现什么?我可以根据您的需要改进答案


无论如何,这是高度相关的。即使这个特定的实现有一个bug,它也肯定是一条路要走。另一种可能是openCL,但概念是相同的。

我不建议在OpenGL中尝试实际的光线跟踪,因为你需要很多技巧和技巧,如果你问我的话,这样做没有任何意义。 如果您想在GPU上进行光线跟踪,您应该使用任何GPGPU语言,例如CUDA或OpenCL,因为它使事情变得更容易(但仍然远远不是琐碎的)

要进一步说明问题,请执行以下操作: 对于光线跟踪,需要跟踪次光线并测试与几何体的交点。因此,您需要在着色器中以某种巧妙的方式访问几何体,但是在片段着色器中,如果不将几何体“编码”到某个纹理中,则无法访问该几何体。顶点着色器也不会以本机方式向您提供此几何体信息,并且几何体着色器只知道邻居,因此这里的问题已经开始。 接下来,您需要加速度数据结构来获得任何合理的帧速率。然而,在着色器中遍历Kd树是相当困难的,如果我没记错的话,有几篇文章专门讨论这个问题。 如果你真的想走这条路,尽管有很多关于这个主题的论文,找到它们应该不会太难

光线跟踪器需要设计非常好的访问模式和缓存才能达到良好的性能。然而,在GLSL中,您对这些功能的控制非常有限,优化性能可能会变得非常困难


另一点需要注意的是,至少据我所知,GPU上的实时光线跟踪主要局限于静态场景,因为kd树仅适用于静态场景。如果您想要动态场景,您需要其他数据结构(例如BVHs、iirc?),但您需要不断维护这些数据结构。如果我没有遗漏任何东西的话,目前仍有很多关于这个问题的研究正在进行。

至于2019,光线跟踪是实时渲染的一个选项,但需要大多数用户没有的高端GPU。 其中一些GPU是专门为光线跟踪而设计的。 OpenGL目前不支持硬件增强的光线跟踪。
windows上的DirectX 12确实支持它。建议在创建仅光线跟踪渲染器之前再等待几年,尽管可以在当前桌面和笔记本电脑硬件上使用DirectX 12。手机的支持可能需要几十年的时间。我不认为openGL支持光线跟踪,但vulkan将来可以支持它。

我发现其他一些答案冗长冗长。对于使用OpenGL API绝对可以构建功能性光线跟踪器的可视示例,我强烈建议您查看人们正在进行的一些项目(警告:lag)

Btw:google scholar是您在这方面的朋友。“加速数据结构”是什么意思?在本文中,加速数据结构会加速查询世界是否被特定3D位置的对象占据。它相对于O(n)进行了加速,在对象列表中进行迭代。您可以使用OpenGL计算着色器编写光线跟踪器。因为人们已经熟悉编写GLSL代码,所以可以更容易地开始。这可能非常有用:尽管我建议使用SSBO来存储数据,而不是纹理。从最新发布的虚幻引擎来看,微软(DirectX)和NVIDIA似乎刚刚发布了实时光线跟踪API