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

时间:2010-09-08 11:28:37

标签: opengl graphics raytracing opengl-3

所以,我应该开始点亮我的平面彩色模特。测试应用程序是仅用于实现最新方法的测试用例,因此我意识到理想情况下它应该实现光线跟踪(从理论上讲,它可能是几年内实时图形的理想选择。)

但我从哪里开始?

假设我从未在旧的OpenGL中做过照明,所以我会直接使用不推荐的方法。

应用程序当前正确设置了顶点缓冲区对象,顶点,法线和颜色输入,并以平面颜色正确绘制和转换空间模型。

是否存在从平面彩色顶点到通过GLSL获得正确最终结果所需的全部信息的来源?理想情况下,可能需要任何其他额外的照明方法来补充它。

4 个答案:

答案 0 :(得分:28)

我不建议在OpenGL中尝试实际的光线跟踪,因为你需要很多黑客和技巧,如果你问我,那就完全没有意义了。 如果你想在GPU上进行光线跟踪,你应该使用任何GPGPU语言,例如CUDA或OpenCL,因为它使事情变得容易多了(但仍然非常简单)。

进一步说明问题: 对于光线追踪,您需要跟踪次要光线并测试与几何体的交点。因此,您需要在着色器内以一种巧妙的方式访问几何体,但是如果您不将其“编码”存储到某些纹理中,则无法访问几何体。顶点着色器本身也不会为您提供此几何信息,并且几何着色器仅知道邻居,因此此处已经出现问题。 接下来,您需要加速数据结构来获得任何合理的帧速率。但是,遍历例如着色器内部的Kd-Tree非常困难,如果我没记错的话,有几篇论文仅针对这个问题。 但是,如果你真的想走这条路,关于这个话题的论文很多,找到它们应该不会太难。

光线跟踪器需要极其精心设计的访问模式和缓存才能达到良好的性能。但是,你对GLSL内部的这些内容只有很少的控制权,并且优化性能会变得非常困难。

另一点值得注意的是,至少据我所知,GPU上的实时光线追踪主要限于静态场景,例如, kd-trees只能用于静态场景。如果你想拥有动态场景,你需要其他数据结构(例如BVH,iirc?),但你经常需要维护它们。如果我没有错过任何内容,目前仍有很多研究正在讨论这个问题。

答案 1 :(得分:20)

你可能会混淆一些事情。

OpenGL是一个光栅化器。强迫它做光线追踪是可能的,但很难。这就是光线追踪不是“几年内实时图形的理想选择”的原因。几年后,只有混合系统才有可行。

所以,你有三种可能性。

  • 纯光线追踪。仅渲染全屏四边形,并在片段着色器中,读取填充在缓冲区(如纹理)中的场景描述,遍历层次结构,并计算光线三角形交叉点。
  • 混合光线追踪。以正常方式栅格化场景,并在场景中某些真正需要它的场景中使用光线追踪(折射,......但它可以在光栅化中同步)
  • 纯光栅化。片段着色器正常工作。

您想要达到什么目标?我可以根据您的需要改进答案。

无论如何,this SO question是高度相关的。即使这个特定的实现有一个bug,它仍然是定义的方式。另一种可能性是openCL,但概念是一样的。

答案 2 :(得分:0)

至于2019年,光线追踪是实时渲染的一个选项,但需要大多数用户没有的高端GPU。 其中一些GPU是专门为光线跟踪设计的。 OpenGL当前不支持硬件增强的光线跟踪。 Windows上的DirectX 12确实对此提供支持。尽管可以将DirectX 12与当前的台式机和笔记本电脑硬件一起使用,但建议在创建仅射线跟踪渲染器之前要等待几年。来自移动设备的支持可能需要数十年的时间。我看不到openGL支持光线跟踪,但是vulkan将来可能会支持它。

答案 3 :(得分:0)

我发现其他一些答案冗长而冗长。对于可以使用 OpenGL API 构建功能性光线追踪器的视觉示例,我强烈建议查看人们在 https://www.shadertoy.com/(警告:滞后)

上所做的一些项目