【Unity Shader】结合Projector和Rendertexture实现实时阴影

本文介绍了在Unity中利用Projector和Rendertexture实现实时阴影的方法,详细阐述了阴影投射的过程,并探讨了与shadowmap技术的区别。通过设置灯光空间摄像机,将Rendertexture投射到物体上,结合Projector处理额外的drawcall问题,以达到阴影效果。同时,文章提到了使用带Alpha通道的Rendertexture可能导致的问题及解决方案,以及如何通过shader实现阴影的模糊效果。
摘要由CSDN通过智能技术生成

之前已在简书上发过,这里重新整理了一下,并附上实现代码。


在unity中实现阴影的文章网上看了不少,包括常用的shadowMap,或直接投射Rendertexture等。比如unity中实现shadowmap,可以通过投射灯光空间的深度图,并在投射物体上进行深度比较,判断是否处于阴影的范围,以此来渲染阴影。将深度图投射到接受阴影的物体上的效果如图所示:


你所需要做的就是在灯光空间渲染一张深度纹理,并投射到接受阴影的物体上,并和接受阴影的物体上对应像素位置的深度(灯光空间)进行比较,来确定当前像素是否处于阴影即可,此外还要考虑深度图的精度以及以此会造成的ZFighting等,当然这并不是本文讨论的重点。

这边我主要介绍一种直接投射灯光空间摄像机的Rendertexture来实现阴影的方法,并将在稍后将其和projector结合。当然同时熟悉这两项技术的开发者应该已经清楚,使用projector实现阴影意味着你将会消耗额外的drawcall,实际上被投射projector并且未在shader中使用"IgnoreProjector"="true"的物体都会在自身shader渲染完(也可能是渲染前,具体看自身渲染队列和projector的shader的渲染队列的先后顺序)后再次使用projector的shader渲染一次,这表示当被projector投射且未标记忽略投影机或不处于投影机忽略的层的物体会再次使用projector的material渲染,所以如果将projector应用在某些场景,比如拥有复杂的场景元素,且大部分是单独的物体而不是合并的,会占用较多drawcall,当然如果projector只影响一小部分元素,比如projector只影响单独模型的地面,则可以不必担心drawcall的问题。

首先比较一下这种技术和shadowmap技术,实际上个人感觉很大程度上两者的技术其实差不多,都需要用到屏幕投影,只不过shadowmap投射的是深度图(深度缓冲),而本文介绍的是直接投射屏幕纹理(帧缓冲),因此投射的纹理是带Alpha通道的。


和shadowmap不同的是,灯光空间的摄像机应该只看到投射阴影的物体:


此时投射后的效果大致如图所示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值