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

xwmevbvl  于 2022-11-04  发布在  其他
关注(0)|答案(6)|浏览(200)

因此,我现在应该开始为我的单色模型照明了。测试应用程序是一个仅用于实现最新方法的测试用例,因此我意识到理想情况下它应该实现光线跟踪(因为理论上,它可能在几年后非常适合实时图形)。
但我该从哪里开始呢?
假设我从来没有在旧的OpenGL中做过照明,所以我会直接使用非过时的方法。
该应用程序目前已正确设置了顶点缓冲对象、顶点、法线和颜色输入,并以平面颜色在空间中正确绘制和转换模型。
是否有一个信息源,将采取一个从平面彩色顶点到所有需要一个适当的最终结果通过GLSL?理想的情况下,与任何其他额外的照明方法,可能需要补充它。

pcww981p

pcww981p1#

我不建议在OpenGL中尝试实际的光线跟踪,因为这需要很多技巧和技巧,如果你问我,我认为这样做根本没有意义。如果你想在GPU上进行光线跟踪,你应该使用任何GPGPU语言,如CUDA或OpenCL,因为它使事情变得容易得多(但仍然远非微不足道)。
为了进一步说明这个问题:对于光线跟踪,你需要跟踪次级光线并测试与几何体的相交。因此,你需要在着色器中以某种巧妙的方式访问几何体,但是在片段着色器中,如果你不将其“编码”存储到某个纹理中,你就无法访问几何体。顶点着色器也不会提供这种原始的几何信息。而几何着色器只知道邻居,所以麻烦已经开始了。接下来,你需要加速数据结构来获得任何合理的帧速率。然而,遍历着色器内部的Kd树是相当困难的,如果我没记错的话,有几篇论文专门讨论了这个问题。2如果你真的想走这条路,尽管有很多关于这个主题的论文,找到它们应该不会太难。
光线跟踪器需要设计得非常好的访问模式和缓存来达到良好的性能。然而,在GLSL中,您对这些几乎没有控制,优化性能会变得非常坚韧。
另一点需要注意的是,至少据我所知,GPU上的真实的光线跟踪大多限于静态场景,因为例如kd树仅起作用如果你想拥有动态场景,你需要其他的数据结构。(例如BVH、iirc?),但您需要经常维护这些内容。如果我没有遗漏任何内容,目前仍有许多研究正在进行中。

7kjnsjlb

7kjnsjlb2#

你可能混淆了一些事情。
OpenGL是一个光栅化器。强迫它做光线跟踪是可能的,但很困难。这就是为什么光线跟踪不是“几年后真实的图形的理想选择”。几年后,只有混合系统将是可行的。
所以,你有三种可能。

  • 纯粹的光线跟踪。只渲染一个全屏四边形,在片段着色器中,读取缓冲区中的场景描述(像纹理一样),遍历层次结构,计算光线-三角形的交点。
  • 混合光线跟踪。以正常方式光栅化场景,并在着色器中对场景中某些真正需要光线跟踪的部分使用光线跟踪(折射,...但可以在光栅化中模拟)。
  • 纯光栅化。片段着色器执行其正常工作。

你到底想达到什么目的?我可以根据你的需要改进答案。
无论如何,这个SO问题是高度相关的。即使这个特定的实现有一个bug,它肯定是要走的路。另一种可能是openCL,但概念是相同的。

wnrlj8wa

wnrlj8wa3#

2019年的光线跟踪是一个真实的渲染的选项,但需要大多数用户都没有的高端GPU。其中一些GPU是专门为光线跟踪设计的。OpenGL目前不支持硬件加速光线跟踪。Windows上的DirectX 12确实支持它。建议再等几年再创建仅光线跟踪渲染器,尽管可以将DirectX 12与当前的台式机和笔记本电脑硬件一起使用。移动的支持可能需要一段时间。

dzjeubhm

dzjeubhm4#

我发现其他一些答案是冗长和罗嗦的。对于视觉示例,是的,功能性光线追踪器绝对可以使用OpenGL API构建,我强烈建议查看一些人们正在https://www.shadertoy.com/上制作的项目(警告:延迟)

nxowjjhe

nxowjjhe5#

OpenGL(glsl)可用于光线(路径)跟踪。但是,有几个更好的选项:Nvidia OptiX(Cuda工具包-跨平台)、directx 12(带有Nvidia光线跟踪扩展DXR -仅限Windows)、vulkan(Nvidia光线跟踪扩展VKR -跨平台,广泛使用)、metal(仅适用于MacOS)、falcor(基于DXR、VKR、OptiX的框架)、Intel Embree(仅限CPU光线跟踪)。

irtuqstp

irtuqstp6#

要回答此主题:OpenGL没有RTX扩展,但Vulkan有,并且可以实现互操作。示例如下:https://github.com/nvpro-samples/gl_vk_raytrace_interop
至于实际问题:为了照亮三角形,有很多的技术,查找“向前”,“向前+”或“延迟”渲染器。要使用的技术取决于你的目标。最简单和最好看的这些天,是基于图像的照明(IBL)基于物理的着色(PBS)。基本上,你使用立方体贴图,并根据对象的光泽度或多或少地模糊它。对于一个简单的对象查看器,你不需要更多。

相关问题