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

41

我现在需要开始给我的单色模型添加光源。测试应用程序是一种仅使用最新方法实现的测试用例,因此我意识到理论上最好实现光线跟踪(因为在未来几年里,它可能是适合实时图形的理想选择)。

但我该从哪里开始呢?

假设我以前从未在旧版OpenGL中进行过光照,因此我将直接采用非废弃的方法。

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

是否有一些信息来源,可以从单色顶点着手,引导我了解所有需要通过GLSL获得正确结果的知识?最好还包括其他可能需要补充的光源技术。

6个回答

45

我不建议尝试在OpenGL中进行真实的光线追踪,因为你需要很多技巧和诀窍,如果问我的话,这样做已经没什么意义了。如果你想要在GPU上进行光线追踪,你应该选择任何GPGPU语言,例如CUDA或OpenCL,因为它会使事情变得更加容易(但仍然不是一件简单的事情)。

为了进一步说明这个问题: 对于光线追踪,你需要跟踪次要光线并测试其与几何体的交点。因此,在着色器内以某种巧妙的方式访问几何体非常必要,然而在片段着色器中,如果你没有将其“编码”到某些纹理中存储,你就无法访问几何体。顶点着色器也不能自然地提供这种几何信息,几何着色器只知道邻居,所以问题已经开始了。 接下来,你需要加速数据结构才能获得合理的帧率。然而,在着色器内遍历一个Kd-Tree相当困难,如果我没记错的话,有几篇论文专门讨论这个问题。 如果你真的想走这条路,还有很多关于这个主题的论文,应该不难找到。

光线追踪器需要极好的访问模式和缓存设计以达到良好的性能。然而,在GLSL内部,你只有很少的控制权,并且优化性能可能会变得非常困难。

另一个要注意的问题是,至少据我所知,GPU上的实时光线追踪大多限于静态场景,因为例如kd-tree仅对静态场景有效(表现良好)。如果你想拥有动态场景,你需要其他数据结构(例如BVHs,如果我没有错的话?),但你需要不断维护它们。如果我没有漏掉任何内容,目前还有很多研究正在针对这个问题进行。


6
顺便说一下,像这样的东西,Google Scholar 是你的好帮手。试试访问 http://scholar.google.de/scholar?q=glsl+ray+tracing。 - zerm
你是指“加速数据结构”是什么意思? - Mathew Kurian
1
在这个上下文中,加速数据结构可以加速查询是否存在一个物体占据了特定的三维位置。相较于O(n)遍历对象列表,它具有更快的速度。 - Justin
1
你可以使用OpenGL计算着色器编写光线追踪器。 这样做会更容易入门,因为你可能已经熟悉了编写GLSL代码。 这个链接可能会很有帮助: http://www.ci.i.u-tokyo.ac.jp/~hachisuka/tdf2015.pdf尽管我建议使用SSBO而不是纹理来存储数据。 - Мартин Радев

30
你可能混淆了一些概念。
OpenGL 是光栅化器。强制它执行光线追踪是可能的,但很困难。这就是为什么光线追踪在未来几年内不是“实时图形的理想选择”。几年后,只有混合系统才是可行的。
因此,你有三种可能性。
1. 纯光线追踪。只渲染一个全屏四边形,在片段着色器中读取场景描述(类似于纹理打包)填充的缓冲区,遍历层次结构并计算光线和三角形的相交点。 2. 混合光线追踪。正常方式下光栅化场景,并在某些真正需要光线追踪的场景部分(如折射,但可以在光栅化中模拟)中使用着色器中的光线追踪。 3. 纯光栅化。片段着色器执行其正常工作。
你究竟想要实现什么?我可以根据你的需求改进答案。
无论如何,这个SO问题与此相关度很高。即使这个特定的实现有一个错误,它绝对是正确的方法。另一个可能性是使用OpenCL,但是概念是相同的。

1
根据最新的虚幻引擎公告,微软(针对DirectX)和NVIDIA似乎刚刚发布了实时光线追踪API。 - George Birbilis

4

就目前而言,2019年光线追踪是实时渲染的选项之一,但需要高端GPU,而大多数用户并没有这样的GPU。其中一些GPU专门为光线追踪而设计。OpenGL目前不支持硬件加速的光线追踪。Windows上的DirectX 12确实支持它。建议在未来几年内等待一段时间再创建仅使用光线追踪渲染器,尽管使用当前桌面和笔记本电脑硬件可以使用DirectX 12进行光线追踪,但移动设备的支持可能需要一段时间。


4

Opengl(glsl)可以用于光线(路径)追踪。然而,有几个更好的选择:Nvidia OptiX(Cuda工具包-跨平台),DirectX 12(带有Nvidia光线追踪扩展DXR-仅限Windows),Vulkan(nvidia光线追踪扩展VKR-跨平台,并广泛使用),Metal(仅在MacOS上运行),Falcor(基于DXR、VKR、OptiX的框架),Intel Embree(仅支持CPU光线追踪)。


1
我不知道为什么我收到了-1,我明确回答了问题,自2010年提出问题以来,许多事情已经发生了变化。OpenGL没有得到太多更新,但NVIDIA致力于支持vulkan、DX和rtx核心。 - bim

1
我发现其他答案有些啰嗦冗长。关于使用OpenGL API构建功能性光线追踪器的可视化示例,我强烈推荐查看一些人们在 https://www.shadertoy.com/ 上制作的项目(警告:会有延迟)。

0

回答主题:OpenGL没有RTX扩展,但Vulkan有,并且可以进行互操作。例如:https://github.com/nvpro-samples/gl_vk_raytrace_interop

至于实际问题:要照亮三角形,有很多技术可供选择,可以查找“forward”、“forward+”或“deferred”渲染器。使用的技术取决于您的目标。如今最简单和最美观的技术是基于图像的照明(IBL)与基于物理的着色(PBS)。基本上,您使用一个立方体贴图,并根据物体的光泽度更多或更少地模糊它。对于简单的对象查看器,您不需要更多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接