unity 半透明混合问题_Unity 实时 半透明 阴影 shader

简单阴影制作思路:

1:在角色脚底 放置一块平板

2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换

3: 得到投影在地面上的阴影

4:阴影直接渲染到 屏幕上

缺点:

上面的阴影无法 增加半透明阴影效果,因为如果直接设置渲染阴影的 pass 为半透明,就会导致阴影不同面片的阴影 之间重叠的部分颜色加深,导致半透明阴影颜色不均匀。

因此采用另一种思路,将阴影作为独立的渲染层, 增加一个相机只用于渲染玩家阴影,使用

Camera.RenderWithShader 接口来渲染,

将阴影渲染到一个 RenderTexture 上面,

接着在主镜头的 OnRenderImage 接口中,将渲染的阴影 renderTexture 和 主镜头渲染的正常场景进行alpha混合。

上面混合主要问题是 如何处理 阴影 renderTexture和 主镜头渲染对象的 深度问题,防止阴影遮挡住其它对象。

Unity中可以设置镜头 Camera.depth 深度模式为 depth,我们设置主镜头深度模式depth,这样主镜头就会产生一个 depthTexture;

这个depthTexture 在shader里面可以通过 _CameraDepthTexture 来访问;

接着我们在阴影渲染shader里面,通过这个_CameraDepthTexture 得到阴影所在位置的深度信息,如果比阴影靠近镜头,我们就将阴影裁减掉。

这样阴影就不会遮挡住其它对象了。

但是再人物脚底可能会因为存在浮点数误差,导致的一些问题,可以在人物脚底增加黑色圆圈,来弥补这个缺陷。

shader中从_CameraDepthTexture 中获得深度信息的核心代码是:

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 代码调整

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值