光线追踪、光线投射、光线行进和路径追踪有啥区别?

Posted

技术标签:

【中文标题】光线追踪、光线投射、光线行进和路径追踪有啥区别?【英文标题】:What is the difference between ray tracing, ray casting, ray marching and path tracing?光线追踪、光线投射、光线行进和路径追踪有什么区别? 【发布时间】:2021-07-24 13:56:51 【问题描述】:

据我所知,标题中提到的所有技术都是看起来非常相似的渲染算法。所有基于光线的技术似乎都围绕着通过图像的每个像素投射光线,这些像素应该代表真实光线。这允许渲染非常逼真的图像。

事实上I am making a simple program 自己根据Raytracing in one Weekend 渲染这些图像。

现在问题是我想以某种方式命名这个程序。我使用了术语“光线追踪器”,因为这是本书中使用的术语。

不过,我听过很多不同的术语,我很想知道光线追踪、光线匹配、光线投射、路径追踪和任何其他常见的光线相关算法之间到底有什么区别。我可以在网上找到这些技术的一些比较,但他们都只比较了其中的两种,而且一些定义重叠,所以我想就这四种技术提出这个问题。

【问题讨论】:

我投票结束这个问题,因为它与编程无关 嗯,问题不在于一段代码,而是由于它是关于渲染的,它与编程密切相关,因此可能对网站用户有用。 @BDL 可能只有我一个人,但是如何澄清与编程无关的非常相似的 渲染算法 之间的区别?它甚至不需要任何教程或文档... 【参考方案1】:

我对此的理解是:

    光线投射

    使用光栅图像来保存场景并且通常在第一次命中时停止(没有反射和光线分裂),并且不一定在每个像素的基础上投射光线(通常是每行或每列屏幕)。其 3D 版本称为 体素空间射线投射,但地图不是体素空间,而是使用 2 个光栅图像RGB,Height

    更多信息见:

    ray cast Voxel space ray casting

    (后)光线追踪

    这通常遵循光的物理特性,因此光线在反射和折射中分裂,我们通常在经过一定次数的命中后停止。场景使用 BR 网格或解析方程或两者来表示。

    更多信息见:

    GLSL 3D Mesh back raytracer GLSL 3D Volumetric back raytracer

    back 意味着我们将光线从相机投射到场景(基于每个像素),而不是从光源投射到任何地方......以错误的照明为代价加快了这个过程(但这可能是在此基础上使用其他方法进行补救)...

其他的我不太确定,因为我不使用这些技术(至少在知情的情况下):

    路径追踪

    是一种优化技术,可使用蒙特卡洛(随机)方法避免光线跟踪中的递归光线分裂。所以它实际上并没有分割光线,而是在两个选项之间随机选择(类似于光子在现实世界中的行为),然后将更多渲染帧混合在一起。

    光线行进

    是一种优化技术,通过使用 SDF(有符号距离函数)来确定沿射线的安全前进,从而加快射线追踪速度,使其不会撞到任何东西。但仅限于分析场景。

【讨论】:

以上是关于光线追踪、光线投射、光线行进和路径追踪有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

GAMES202 笔记-实时光线追踪

2 追踪光线=》2.7 透射光线

2 追踪光线=》2.1

实现光线追踪

减少光线追踪时的计算

光线追踪:带有区域光的水平伪影