分享一组自己写的实时折射、镜面反射shader

2015年03月17日 10:38 0 点赞 2 评论 更新于 2020-01-16 15:25

在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资源:点击下载

作者信息

menghao

menghao

共发布了 332 篇文章