MY BLOG DIRECTORY:

YivanLee:专题概述及目录?

zhuanlan.zhihu.com
图标

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:

YivanLee:虚幻4渲染编程(光线追踪篇)【第六卷:Shadow in real-time raytracing】


推荐阅读:
相关文章