# Begin ray marching in unreal engine 4【第一卷:在材质编辑器中启程】 RayMarching是一个比较好玩的技术,不需要什么顶点数据纹理数据就能画出很多东西。如果你对raymarching的概念还不是很清楚可以去看看下面的文章: Ray Marching and Signed Distance Functions jamie-wong.com![图标](ray marching in unreal_1.assets/v2-79310ca4d03047c9a9a61512f5e2d9ce_ipico.jpg) 这是国外一个大神的文章,里面详细介绍了ray marching的原理。 下面我来梳理一下ray marching的步骤 (1)构建距离场,构建距离场的方法有很多,我们可以用公式或者用3Dtexture都可以,或者用2Dtexture的序列图3Dtexture拟合 (2)RayMarching出表面 (3)贴图映射 光影着色啥的 所以我们的代码框架就有了: ```text //高度场元素函数 float sphere(float3 p, float3 c, float r) { } float cube( float3 p, float3 b, float r ) { } //高度场构建函数 float scene(float3 rp) { } //raymarching函数 float4 render(float3 ro, float3 rd) { } 主函数 float4 MainImage(float3 ro, float3 rd) { } ``` 可以看到我们的代码思路十分清晰,sphere函数和cube函数是距离场的子元素,scene是构建整个距离场,render函数负责raymarching,mainimage函数是我们的主函数。 下面我们来一步步在unreal中实现一个简单的ray marching吧 【1】第一步:新建一个工程,版本是4.19的。 【2】第二部:把我们的UnrealShaderToy丢进我们的项目的plugin中 ![img](raymarchinginunreal_1.assets/v2-6b6e8d94bc371dfaa62e87ec500fbe40_hd.jpg) 这个插件在技术美术群的群文件中,技术美术群号是:192946459 ![img](raymarchinginunreal_1.assets/v2-53470825a4397a5d70f1f3d4e5391a00_hd.jpg) 然后启动项目,确保插件是启用的 ![img](raymarchinginunreal_1.assets/v2-0ca427c1447d57c847c4e0cb2df18f58_hd.jpg) 然后在材质编辑器的主窗口呼出shadertoy节点 ![img](raymarchinginunreal_1.assets/v2-abe32913c7d340c082b8112af0476c87_hd.jpg) 键入如下代码: ![img](raymarchinginunreal_1.assets/v2-39e3785fefb2d59725e484d4228b2d80_hd.jpg) ![img](raymarchinginunreal_1.assets/v2-78428035cffb5d6e22f1d15b76c72e76_hd.jpg) 然后你就能看到两个图元组成的几何体啦,让我们来修改一下scene函数 ![img](raymarchinginunreal_1.assets/v2-6f95ce9f62bf5f6fa87327875994980b_b.jpg) ```text float scene(float3 rp) { float d = 0; float sp = sphere(rp,float3(0,100,0),100); float sp2 = sphere(rp,float3(0,0,100),80); d = (sp < sp2) ? sp : sp2; return d; } ``` 可以看到有两个球啦 ![img](raymarchinginunreal_1.assets/v2-8ed2c1439edb7dd88b19d7bb0b68c34c_b.jpg) 让我们来加入更多变化,比如更新球的位置 ![img](raymarchinginunreal_1.assets/v2-56d93dd6c0ce1c5dc206267ecaa8d4db_hd.jpg) ![img](raymarchinginunreal_1.assets/v2-97691888197b3513e1b5d9d75cb928fe_b.jpg) 大概的raymarching框架就是这样了,后面我们为这个框架加入整套PBR管线