Begin
这个冬天积雪的屏幕特效,从效果上看还是不错的。
实现的原理还是挺简单的。首先获取到屏幕像素的深度纹理信息,得到每个像素的法线。利用法线的Y值得到积雪的程度。然后把积雪贴图和原本的贴图进行混合。
获取屏幕像素的深度纹理
屏幕特效的实现都需要有一个cs脚本和shader 文件。
在cs脚本上,设定好摄像机获取深度纹理
void OnEnable() {
GetComponent<Camera>().depthTextureMode |= DepthTextureMode.DepthNormals;
}
然后需要在shander 文件中定义变量 ,和把屏幕坐标的法线转换为世界坐标的法线。
sampler2D _CameraDepthNormalsTexture;
fixed4 frag (v2f i) : SV_Target
{
half3 normal;
float depth;
float2 uv =float2(i.uv.x, i.uv.y);
DecodeDepthNormal(tex2D(_CameraDepthNormalsTexture, uv), depth, normal);
normal = mul( (float3x3)_CamToWorld, normal);
}
完整代码实现
1 屏幕特效基类,来自 Unity shader 入门精要 这本书的。主要是检测硬件是否支持屏幕特效。
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
public class PostEffectsBase : MonoBehaviour {
// Called when start