话不多说先上图,有镜面反射,投影器方式实现阴影,下雨效果,工程放最后
镜面反射
镜面反射原理:通俗点说法就是就是在摄象机对称的正下方和主摄象机看同一个焦点,这个反射摄象机看到的东西就是镜面反射的东西,然后这个反射摄象机渲染一张图,扔给地面显示(需要忽略地面层渲染)
下面是反射镜头渲染的图片
镜面反射优化
1.真实项目中不可能直接用摄象机渲染,多数都会采用替换shader方式渲染,主要是角色shader一般都是比较复杂,使用简单的shader替换渲染提高性能
2.利用cubemap制作反射和反射镜头渲染出来的角色反射结合在一起,这可以减少渲染的物体,渲染和内存就是鱼和熊掌
这两种方式在angrybots里面都有使用过,这个项目很多地方值得参考
3.可以使用反射摄象机使用commandbuff来进行渲染能优化性能(后面工程更新提供)
镜面反射shader相关
shader所要做的事情是计算出镜面在屏幕空间上对应的坐标,然后以此作为UV值去反射纹理取出对应的颜色值
下面是surface代码演示
struct Input
{
float2 uv_MainTex;
float4 screenPos;
float3 worldPos;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 rtRefl = tex2D(_ReflectionTex, (IN.screenPos.xy / IN.screenPos.w)) *0.3;
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color + rtRefl;
o.Albedo = c.rgb;
}
使用投影实现动态阴影
投影阴影原理:固定角度正交摄象机渲染角色的黑白图(需要替换shader方式),渲染出来的图片进行模糊,然后用投影的方式渲染到地面(需要忽略角色层)
下面是投影摄象机渲染的图片
投影动态阴影优化
1.还是使用替换shader方式
2.场景动态进行烘培,只有玩家执行动态阴影
3.投影摄象机使用commandbuff可以提交效率(后面工程更新提供)
关于下雨效果
可以看看链接,下雨效果
地面的效果是根据一张噪音图进行简单扭动,整体效果给人感觉下雨,水往某个方向流动
https://gitee.com/PieKen/UnityReflectionAndProjectShadow