Unity Shader Graph实现反射静态物体效果

Unity Shader Graph实现反射静态物体的效果

这里尝试利用unity自带的节点编辑器 Shader Graph实现简单的反射静态物体的效果,使物体可以反射周围环境。
首先看一下最终实现的效果图:
Unity Shader Graph实现反射静态物体效果_第1张图片

创建Shader和Material

Unity Shader Graph实现反射静态物体效果_第2张图片
  由于Shader Graph目前只支持在LWRP(轻量级渲染管线)和HDRP(高清渲染管线)中使用,在创建新的projcet的时候我们选择HDRP。
  创建好项目以后,和普通的shader流程一样,我们先创建一个新的材质球;然后创建一个Unity Shader,并将这个shader赋给上一步创建的材质;然后把材质球赋给需要渲染的对象,这里我们用一个sphere球体来演示反射的效果。
  Unity Shader Graph实现反射静态物体效果_第3张图片
在新建untiy shader graph的时候有三种选择:
1.PBR Garph:这是一个应用HDRP自带光照模型的Shader模板,通常我们在不需要额外制作光照的时候选择这个模板
2.Sub Graph:Sub Graph是一个非常常用的Shader模板,可以理解为子Shader,可以用它来封装Shader中的功能,既可以使界面简洁,也方便复用某个功能
3:Unlit Graph:无光照的Shader模板.这个模板常用于需要自己设计光照模型的时候.
这里我们不考虑自己设计光照,所以选择PBR Graph.

使用CubeMap节点实现反射特定的静态环境

Unity Shader Graph实现反射静态物体效果_第4张图片

Unity Shader Graph实现反射静态物体效果_第5张图片
我们把Cubemap节点连接到PBR Master的Emission(自发光)属性上输出,是物体能够反射特定的Cubemap.节点的输入依次是Cube:用Cubemap Asset节点载入一张Cubemap;ViewDir:用view Direction节点控制视角方向;Normal: 用Normal Vecter控制法线 LOD:这个值用来调节反射的效果,值为0的时候反射效果最清晰,值越大越模糊.
我们把这个属性暴露出来,名字叫做CubemapBlur,下图是CubemapBlur为0和1时的效果对比.

使用Reflection Probe组件生成当前场景的Cubemap

我们已经确定使用Cubemap贴图的形式来实现反射,那么怎么将当前场景制作成一张反射用的Cubemap呢?这里我们用unity自带的Reflection Probe烘焙一张反射贴图.
1.Create Empty : 创建一个空物体来挂载Reflection Probe组件
2. Add Component: 选择Reflection Probe
Unity Shader Graph实现反射静态物体效果_第6张图片
3. 添加后我们可以看到该组件的属性,第一排四个按钮用来移动和缩放,调节需要反射的范围,调节方式和碰撞体的调节类似(具体效果比较玄学,大家可以自己调着试一下)
需要注意的是nearclip和farclip属性,默认是0.3和1000.但是通常不需要反射这么大的范围,我这里把farclip改到了100.

调整好参数之后,点击下面的bake就可以开始烘焙了.烘焙完成后我们可以在场景同级文件夹下找到一个与场景同名的文件夹,其中有烘好的.exr文件就是我们需要的场景环境反射贴图.
Unity Shader Graph实现反射静态物体效果_第7张图片

添加Fresnel效果

为了使反射更加逼真,添加简单的Fresnel效果,节点编辑如下图:
Unity Shader Graph实现反射静态物体效果_第8张图片

然后和之前的Cubemap整合一下,整合方式还是用Multiply.

Unity Shader Graph实现反射静态物体效果_第9张图片
这里设计的几个参数是用来控制Fresnel的程度和混合的程度,具体参数值可以根据效果需求调节一下.

你可能感兴趣的:(shader Graph)