我一直在看这里的shaderoy.com中的着色器,大多数很酷的着色器都有共同的噪点和raymarch。我完全不了解源代码,但我确实想要。这些着色器如何工作,raymarch算法如何工作?我到处搜索,找不到关于该主题的任何内容。
谢谢
我一直在看这里的shaderoy.com中的着色器,大多数很酷的着色器都有共同的噪点和raymarch。我完全不了解源代码,但我确实想要。这些着色器如何工作,raymarch算法如何工作?我到处搜索,找不到关于该主题的任何内容。
谢谢
Answers:
与光线跟踪相比,这可能最容易理解。
要使用光线跟踪渲染图元,您需要一个函数,该函数会在给定图元和输入光线的情况下,准确告诉您该光线撞击图元的位置。然后,您可以针对所有相关图元测试射线,并选择最接近的交点。CPU擅长于此。
使用raymarching时,您没有这么简单的光线相交功能。给定射线上的一个点,您可以估计该点与表面的接近程度,但是您不知道确切需要多远的距离才能将射线延伸到表面上。
因此,您一次“进行”一步:
从光线的“起点”开始-场景渲染的近平面,或者如果它只是场景中的一个对象,则与光线的边界相交。(下图中的P0)
评估距离函数以获得对曲面的距离的估计。(图中最大的圆圈)
根据您的估计,沿着射线向前移动。保守地说,此举应该很短,所以您有信心不会在任何地方穿过地表。
现在您有了一个新的点(下面的P1)-获得一个新的估计并重复。
继续获取估计值并向前走,直到您到达曲面的阈值距离以内,或者达到最大步数。(下面的P4)
现在您有了表面的深度,并且可以从附近的样本中推断出法线/环境光遮挡之类的东西,并使用此数据对像素进行着色和着色。
由于每条射线都是独立的,并且每个步骤仅使用(通常)本地信息,因此在GPU上进行并行化的时机已经成熟。通常,屏幕上只会绘制两个三角形。光栅化这些像素后,传递到片段着色器的每个像素代表一条光线。片段着色器使光线行进,直到到达表面为止,然后返回结果(通常只是在单独的全屏通道中进行纹理化和着色的深度值)。
确切的步骤在很大程度上取决于您要达到的特定效果。Raymarching技术用于...
Raymarching还用于混合每个步骤(通常使用固定步骤而不是每次都估计距离)来渲染体积半透明性,如Wikipedia中的示例所示。
这已经成为一种实时渲染详细云的流行方法。
甚至“ 内部贴图”(一种模拟建筑物窗户后面的室内细节)的方法,也可以被视为一种光线散布的形式,其中光线从进入窗户的点开始逐步步进到最近的墙壁,地板/天花板或家具平面。
如果您对特定类型的光线触发效果感兴趣,则可以通过提出带有特定示例的新问题来获得更详细的答案。作为一个家庭,这项技术过于多样化,无法一口气覆盖所有内容。;)我希望这为您提供了一个框架,以了解这些着色器的底层功能。