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

j r*_*riv 28 opengl graphics raytracing opengl-3

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

但是我从哪里开始呢?

假设我从未在旧的OpenGL中完成照明,所以我将直接使用不推荐的方法.

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

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

zer*_*erm 30

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

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

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

需要注意的另一点是,至少据我所知,GPU上的实时光线跟踪主要限于静态场景,因为例如kd树仅适用于静态场景.如果你想拥有动态场景,你需要其他数据结构(例如BVH,iirc?),但你经常需要维护它们.如果我没有错过任何内容,目前仍有很多研究正在进行中.

  • 顺便说一句:谷歌学者是你这样的朋友.http://scholar.google.de/scholar?q=glsl+ray+tracing怎么样? (5认同)

Cal*_*602 22

你可能会混淆一些事情.

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

所以,你有三种可能性.

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

你到底想要达到什么目的?我可以根据您的需求改进答案.

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


bim*_*bim 5

Opengl (glsl) 可用于光线(路径)追踪。然而,还有一些更好的选择:Nvidia OptiX(Cuda 工具包——跨平台)、directx 12(带有 Nvidia 光线追踪扩展 DXR——仅限 Windows)、vulkan(Nvidia 光线追踪扩展 VKR——跨平台,并且广泛使用), metal(仅适用于 MacOS)、falcor(基于 DXR、VKR、OptiX 的框架)、Intel Embree(仅适用于 CPU 光线追踪)。