MY BLOG DIRECTORY:
YivanLee:专题概述及目录INTRODUCTION:
在实时光线追踪里有个MissShader的概念,不知道为什么一看到“miss”我就想到了“return”?进而想到“失败返回”?这种惯性思维挺奇怪的。其实在MissShader只是光线未击中的时候要执行的shader,它还能做很多事情。延迟渲染,实时光线追踪和RayMarching各有优势,如果能把他们的优势都结合一下该有多好,所以下面我在Raytracing里尝试结合Raymarching的渲染方式。
MAIN CONTENT:
因为光线追踪的时候我们已经就从屏幕发射射线了,像ShaderToy一样,在做Raymarching之前需要RayMarchingRay的起始位置,这在Raytracing的时候就已经有了。
我们在RayTracingDebug.usf里添加如下代码:
启动引擎把View调到对应的debug选项你将会看到:
这不就是RayMarching的第一步么!我们这样就轻松完成了一切麻烦的架构。下面就可以愉快地在世界空间做RayMarching啦。
为raymarching添加距离场函数和距离场场景构建函数
然后再RayTracingDebugMainRGS中的miss分支进行raymarching
最后打开场景后我们将会看到:
我们成功在世界场景中Marching一个球出来。
修改下距离场函数,构建两个球出来:
最后用梯度方程求出法线:
float3 normal(float3 ro)
{
float2 eps = float2(0.002, 0.0);
return normalize(float3(
scene(ro + eps.xyy) - scene(ro - eps.xyy),
scene(ro + eps.yxy) - scene(ro - eps.yxy),
scene(ro + eps.yyx) - scene(ro - eps.yyx)
));
}
RayMarching内的修改如下:
最后可得效果如下:
至此我们把光线追踪和Raymarching结合到了一起。
SUMMARY AND OUTLOOK:
现在已经可以将延迟渲染,光线追踪,Ray marching全部结合到一起,可以发挥无穷大的力量,相互弥补了双方的不足,我觉得未来这块有很大潜力。我这里只是抛砖引玉。
Enjoy it !
NEXT: