RayMarching光线步进(一)深度



↑canvas 可以直接F12查看webgl代码
球的深度信息和利用深度绘制的颜色(是的这是3D空间中的球不是圆)


之前学习RayMarching的时候还没有买这个网站,最近想尝试用ShadowMapping的方法实现下雨的遮挡效果,在虚幻中不改引擎好像比较难实现,正好复习下RayMarching再记录下。


刚开始接触RayMarching的时候没看到教程硬啃的代码,下面是之前学的时候自己尝试理解的RayMarching


右边代码来自JamieWong 当初就是硬啃的他的代码


RayMarching的思路大致是:


  • 定义一个点eye作为摄像机的位置(通常用ro,RayOrgin),再利用uv作为视线方向向量的xy轴,定义z轴的长度来控制视角,标准化后得到视线方向向量(rd,RayDirection)。
  • 距离场(全场正向距离场SDF,SignedDistanceField)。不管RayMarching还是RayTracing,或者很多基础图形绘制上都会用到距离场,利用距离场也可以做出很多有趣的效果(shadertoy上很多花里胡哨的效果都离不开距离场),有时间以后会单开一篇整理下,在这里可以理解成一个可以计算空间上任意一点到物体表面的距离的公式。
  • 现在我们有了摄像机的位置,可以计算空间任意一点到物体表面的距离。所以我们从相机出发,屏幕上的每个像素(要有并行的思路理解)沿着各自的方向从最近的裁切(nearclip没有精度问题所以直接用的0.)出发,开始循环,每往前推进到一个点,计算该点到物体的表面距离(不能把到表面的距离当作深度,看上图,表面上里的最近的点可能不在射线的方向上),直到前进到一个点,这个点到表面的距离小于极小值epsilon,这样我们就可以把该点到相机的距离近似等于深度。
  • 对于一定循环次数后仍不满足条件和超出最远裁切距离的,都要做一定的限制。(关于循环次数有个比较蠢的经验就是尽量避免物体表面与视线平行,我之前做了个平行的路,这样视线也平行的话,如果我相机离地1m,这样就是循环个一百次也只能向前走100m,十分智障)
  • 完成上面的步骤就可以得到深度的信息,then fun with depth.