39

所以我现在应该开始为我的单色模型照明。测试应用程序是仅用于实现最新方法的测试用例,因此我意识到理想情况下它应该实现光线追踪(因为理论上,它可能在几年内成为实时图形的理想选择)。

但是我从哪里开始呢?

假设我从来没有在旧的 OpenGL 中做过光照,所以我会直接使用非弃用的方法。

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

是否有一个信息来源可以从平面彩色顶点到通过 GLSL 获得正确最终结果所需的所有信息?理想情况下,与可能需要补充它的任何其他附加照明方法一起使用。

4

5 回答 5

39

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

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

光线追踪器需要精心设计的访问模式和缓存才能达到良好的性能。但是,您在 GLSL 中对这些功能几乎没有控制权,因此优化性能会变得非常困难。

另一点需要注意的是,至少据我所知,GPU 上的实时光线追踪主要限于静态场景,因为例如 kd-trees 仅适用于(很好)静态场景。如果您想拥有动态场景,您需要其他数据结构(例如 BVH、iirc?),但您经常需要维护这些数据结构。如果我没有遗漏任何东西,那么目前仍然有很多关于这个问题的研究。

于 2010-09-08T11:44:19.973 回答
28

你可能会混淆一些事情。

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

所以,你有三种可能。

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

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

无论如何,这个SO问题是高度相关的。即使这个特定的实现有一个错误,它也绝对是要走的路。另一种可能是openCL,但概念是一样的。

于 2010-09-08T11:40:26.970 回答
2

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

于 2019-03-16T22:00:41.503 回答
1

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

于 2021-05-01T16:49:32.823 回答
0

如果你真的很擅长,Opengl 和 glsl 可以同时用于光线和路径追踪。但是,几乎没有其他更好的选择,例如带有 Cuda 工具包的 Nvidia optix、directx 12、vulkan 光线追踪、metal、falcor。请注意,所有这些都是低级 API,它们可以与 Nvidia 最近的 rtx 技术一起获得良好的性能并支持多 GPU

于 2022-01-04T23:31:08.857 回答