分享一组自己写的实时折射、镜面反射shader
在Unity中,并没有原生的实时镜面反射Shader。下面为你详细介绍我所编写的这组相关Shader及其使用方法。
资源文件说明
这组资源包中包含4个文件,具体信息如下:
- Mirror.cs:这是一个用于与Shader进行互动的脚本。在使用这组材质时,需要将该脚本挂载到使用的物体上,这样才能使效果生效。
- Mirror - BumpSpec.shader:这是一个实时镜面反射Shader,它可以与法线贴图配合使用,比较适用于平面物体。
- Mirror - AlphaBumpSpec.shader:具备实时镜面反射和透明材质效果,能够同时实现反射和透明效果,同样也可以配合法线贴图使用,适用于平面物体。
- Mirror - AlphaSpecSphere.shader:与上一个材质功能类似,但适用于球面物体,不过不能使用法线贴图。
Shader参数说明
这组Shader的使用较为简单,仅包含几个参数,具体效果需要慢慢调节。下面对几个关键参数进行详细解说:
- Main Material Blend Level:主材质的混合浓度。
- Bump Rate:法线贴图强度。
- Reflection Rate:反射强度。
- Reflective Color:反射颜色。
- Reflective Distortion:反射图受法线影响的强度。
- Transparency:对于同时具备透明和反射效果的材质,该参数用于调节透明与反射的混合比例。取值为0时表示全反射,取值为1时表示全透明。
- Distortion:反射和透明效果受法线影响的强度。
另外,每个Shader都有一个自动的贴图,无需手动设置,该贴图由脚本自动完成设置。
Mirror脚本参数说明
- Disable Pixel Lights:禁用Pixel Lights,此设置与Unity摄像机的对应设置相关。
- Texture Size:反射贴图精度,默认值为256。如果觉得反射效果模糊,可以直接增大该值,修改后会即时生效。不过,不要将其设置得过大,通常1024足以满足绝大多数需求。
- Is Flat Mirror:如果是平面反射物体,需要勾选该选项;如果是球体,则取消勾选,同时材质也要选择相应的类型。
- Reflect Layer:反射的culling mask,可用于屏蔽指定的层。
技术参考与效果说明
这组Shader和脚本参考了Unity的水效果,脚本基本是水包中反射脚本的简化版。需要注意的是,由于这只是模拟效果,并非真正的光线跟踪效果,所以折射效果并不十分准确,但基本能满足视觉观感需求。
使用注意事项
- 渲染方式:目前这组Shader仅适用于Forward渲染模式。在Deferred渲染模式下,会出现贴图倒置、光线暗淡等问题。
- 反射物体:尽量避免反射物体之间相互反射,因为这样不仅会消耗大量资源,而且效果也不准确。
- 资源开销:实时反射本身的开销极大,因此在使用时应尽量避免滥用。
效果展示
- 实时镜面反射
- 实时双镜面反射
- 实时双镜面哈哈镜效果
- 配合法线贴图实现实时雨天路面反射
- 配合法线贴图实现水面反射
- 模拟透明球体折射
- 模拟球面反射
- 同时反射透明,模拟玻璃效果
- 官方DEMO升级版,同时反射折射的彩色玻璃效果模拟
- 模拟毛玻璃效果
文中示例所使用的小阿模型来自互联网,Q7模型来自本论坛,材质均重新进行了调试,所有图像均未进行烘焙或使用Light Probe,都是直接渲染的结果。
资源链接
你可以通过以下链接下载这组Shader资源:点击下载