Raymarch着色器如何工作?


49

我一直在看这里的shaderoy.com中的着色器,大多数很酷的着色器都有共同的噪点和raymarch。我完全不了解源代码,但我确实想要。这些着色器如何工作,raymarch算法如何工作?我到处搜索,找不到关于该主题的任何内容。

谢谢


6
IñigoQuilez为此撰写了出色的教程。见iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htmiquilezles.org/www/material/nvscene2008/nvscene2008.htmiquilezles.org/www/articles/distfunctions/distfunctions.htm。这些很酷的着色器不仅是任何光线渐变,而且特别是光线渐变距离场,也称为球体跟踪。
msell 2013年

您是在问一般的光线行进还是GPU上的光线行进?
concept3d

@Milo您能澄清您的问题吗?您是否在问这些算法如何用于生成您在超酷演示中看到的图像?您是在问射线行进的原理吗?您是否在问片段/像素着色器中的光线行进(即有效实现)如何工作?
TravisG 2013年

Answers:


79

与光线跟踪相比,这可能最容易理解。

要使用光线跟踪渲染图元,您需要一个函数,该函数会在给定图元和输入光线的情况下,准确告诉您该光线撞击图元的位置。然后,您可以针对所有相关图元测试射线,并选择最接近的交点。CPU擅长于此。

使用raymarching时,您没有这么简单的光线相交功能。给定射线上的一个点,您可以估计该点与表面的接近程度,但是您不知道确切需要多远的距离才能将射线延伸到表面上。

因此,您一次“进行”一步:

  1. 从光线的“起点”开始-场景渲染的近平面,或者如果它只是场景中的一个对象,则与光线的边界相交。(下图中的P0)

  2. 评估距离函数以获得对曲面的距离的估计。(图中最大的圆圈)

  3. 根据您的估计,沿着射线向前移动。保守地说,此举应该很短,所以您有信心不会在任何地方穿过地表。

  4. 现在您有了一个新的点(下面的P1)-获得一个新的估计并重复。

  5. 继续获取估计值并向前走,直到您到达曲面的阈值距离以内,或者达到最大步数。(下面的P4)

  6. 现在您有了表面的深度,并且可以从附近的样本中推断出法线/环境光遮挡之类的东西,并使用此数据对像素进行着色和着色。

使光线从P0向其交点前进

GPU Gems 2第8章中的示例图

由于每条射线都是独立的,并且每个步骤仅使用(通常)本地信息,因此在GPU上进行并行化的时机已经成熟。通常,屏幕上只会绘制两个三角形。光栅化这些像素后,传递到片段着色器的每个像素代表一条光线。片段着色器使光线行进,直到到达表面为止,然后返回结果(通常只是在单独的全屏通道中进行纹理化和着色的深度值)。

确切的步骤在很大程度上取决于您要达到的特定效果。Raymarching技术用于...

  • 高度场,可在传统栅格化几何图形上模拟表面位移(视差遮挡贴图)
  • 场景深度缓冲区,用于屏幕空间反射
  • 用于可视化3D采样数据集的体积纹理(通常是科学/医学)
  • 隐式函数,用于呈现诸如分形之类的东西
  • 过程距离字段,就像IñigoQuilez 的作品一样(上面评论中msell的出色链接)。

Raymarching还用于混合每个步骤(通常使用固定步骤而不是每次都估计距离)来渲染体积半透明性,如Wikipedia中的示例所示

光线穿透半透明的体积纹理

这已经成为一种实时渲染详细云的流行方法。

甚至“ 内部贴图”(一种模拟建筑物窗户后面的室内细节)的方法,也可以被视为一种光线散布的形式,其中光线从进入窗户的点开始逐步步进到最近的墙壁,地板/天花板或家具平面。

如果您对特定类型的光线触发效果感兴趣,则可以通过提出带有特定示例的新问题来获得更详细的答案。作为一个家庭,这项技术过于多样化,无法一口气覆盖所有内容。;)我希望这为您提供了一个框架,以了解这些着色器的底层功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.