简单阴影制做思路: 1:在角色脚底 放置一块平板 2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换 3: 获得投影在地面上的阴影 4:阴影直接渲染到 屏幕上code
缺点: 上面的阴影没法 增长半透明阴影效果,由于若是直接设置渲染阴影的 pass 为半透明,就会致使阴影不一样面片的阴影 之间重叠的部分颜色加深,致使半透明阴影颜色不均匀。对象
所以采用另外一种思路,将阴影做为独立的渲染层, 增长一个相机只用于渲染玩家阴影,使用 Camera.RenderWithShader 接口来渲染, 将阴影渲染到一个 RenderTexture 上面,接口
接着在主镜头的 OnRenderImage 接口中,将渲染的阴影 renderTexture 和 主镜头渲染的正常场景进行alpha混合。ip
上面混合主要问题是 如何处理 阴影 renderTexture和 主镜头渲染对象的 深度问题,防止阴影遮挡住其它对象。it
Unity中能够设置镜头 Camera.depth 深度模式为 depth,咱们设置主镜头深度模式depth,这样主镜头就会产生一个 depthTexture; 这个depthTexture 在shader里面能够经过 _CameraDepthTexture 来访问;io
接着咱们在阴影渲染shader里面,经过这个_CameraDepthTexture 获得阴影所在位置的深度信息,若是比阴影靠近镜头,咱们就将阴影裁减掉。 这样阴影就不会遮挡住其它对象了。cli
可是再人物脚底可能会由于存在浮点数偏差,致使的一些问题,能够在人物脚底增长黑色圆圈,来弥补这个缺陷。渲染
shader中从_CameraDepthTexture 中得到深度信息的核心代码是:co
vert(){浮点数
v.pos = mul(MVP, vertex); v.screen = CameraScreenPos(v.pos); EyeLinear(v.screen.z); v.uv = v.pos.xy;
}
frag() {
d = SAMPLE_DEPTH_PROJ(_CameraDepthTexture, v.uv); EyeLinear(d); clip(d, v.screen, 1e-2f)
}
参考 Unity Image Effect 代码中的: MotionBlurClear.shader
须要注意问题:
深度计算须要根据根据 投影的平面阴影来计算 不要用 原始模型计算,所以须要 ComputerSceenPos 代码调整