问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Unity无光照假阴影Shader实现及常见问题总结

发布网友 发布时间:2022-11-07 22:36

我来回答

1个回答

热心网友 时间:2023-09-18 11:50

1.实时光照
实时光照属于真阴影,一般来说效果是最好的,但是开销也是最大的

2.脚底放置阴影面片模拟阴影
一般是无光照小型游戏的常见解决方案,开销较小,表现形式较差,面片是死的,无法根据人物动作变化

3.通过顶点shader变换成面片模拟阴影
如上图Gif所示
优点 : 表现形式上比方案2强,阴影可跟随顶点动画,开销比实时阴影要少
缺点 : 无法在 "非平面" 使用,比如在斜坡上,会穿帮

4.通过 Projector 或者 Decal 来模拟投射阴影
优点 : 表现效果更近一步,也可以在斜面上进行投影了
缺点 : 开销也更近一步

思路
1.我们通过2个Pass来渲染,第二个Pass正常渲染角色,第一个Pass模拟渲染阴影
2.我们需要将模型的所有 Y 值压到地面高度,这样就形成了一个头顶俯视图的阴影效果
3.我们再对 XZ 方向进行偏移,偏移量根据模型原先 Y 值高度为参考做插值
4.阴影的方向我们规定在 XZ 平面上 (X=0,Z=1) 为初始默认方向,以这个向量为基准进行旋转
5.旋转我们可以通过 二维旋转矩阵 来计算

过程中遇到的问题:

1.我在对以Y值高度为参考做XZ方向偏移的插值的时候,由于Y值低于地面取到了负值而这些值有没有被裁剪掉就导致了上图的问题,然后首先想到的是对插值做 max(0,插值结果),然后我们又得到了如下结果

2.上面第一个问题好像是解决了,但是实际上人物到地面以下之后人物还是有一个顶部投影的值,即XZ平面未偏移的结果,那么解决方案自然而然的想到,通过 Y 值和地面的值比较,Y值如果小于地面那么就Clip掉当前片段 Clip( Y值_ws - 地面Y高度_ws) , ws表示世界空间,那么实际上第一个问题也就处理掉了,无需多一步max函数了

3.紧接着,我们需要考虑降低阴影的透明度,但是出现上图问题,导致该问题的原因是,由于将人物顶点变换的同一个Y值后,部分片段是有重叠,就相当于如果直接把人压扁后那么就前胸贴后背,我们需要的是前胸或者后背只渲染依次就可以了,那么自然想到了模板测试Stencil,模板缓存的初始值都为0,我们将渲染阴影通道的Pass中的Ref引用值设为1,当我们的值 [大于] 模板缓存的值就替换,那么假设我们前胸进来一看发现缓冲区里的值为0,自己是1,然后进行替换,但是后背再进来发现已经是1了,不满足[大于]的条件了,所以就不写入了...

4.紧接着,又得到了一些奇怪的问题,在我已经将Blend模式设置为SrcAlpha OneMinusSrcAlpha后发现将影子的颜色Alpha值设置为拖动到0的时候并不会让影子消失,而是颜色更深了,很奇怪,想了很久不知道为什么,但是左边就很正常,左边人物和右边人物的shader唯一差别在于:
左边Shader的两个Pass先渲染人物再渲染阴影
右边出错的Pass先渲染阴影再渲染人物
然后我尝试将左边Shader中的Pass1删除掉,只渲染阴影,我发现它也不正常了...真特娘的奇怪,而且FrameDebug逐Draw渲染的结果也有点奇怪
然后改变摄像机颜色后,发现阴影颜色跟随摄像机颜色改变,于是我发现那可能那不是阴影而是透过去的背面,于是我在地面下方放置了一个小球,然后发现确实是看到地面下方的内容了,再通过FrameDebug调试发现问题所在,将镜头拉近的时候,先渲染的小球,然后紧接着就渲染了右边人物的阴影通道,所以结果是不正确的,因为我们需要阴影渲染在地面上,但是地面还没有渲染,所以我们Blend的时候是和背后的天空盒还有小球混合了导致阴影出错的,但是问题又来了,为什么左边的就没有问题呢,原因是这样的...
地面,左侧人物,右侧人物...由于他们的渲染队列Queue都是Geometry,且值都为2000,所以他们在渲染的时候会随着距离摄像头的远近而可能出现不同的Draw绘制顺序,但是针对多通道的Shader

所以,第一个通道Pass会随着摄像机的远近而变化,但是由于左侧人物的阴影绘制是放在了第2个通道里的,所以绘制的时候,地面是肯定已经绘制完了的,而右侧人物第1个Pass就是阴影,具体是绘制在Plane之前还是之后会随着摄像机远近而不同

该问题解决方案 :
1.将右侧的阴影通道放到第二个Pass中渲染
2.手动修改右侧Shader的渲染排序"Queue" = Gemotry+1" ,让它排在Plane后面渲染
3.将"Queue" = "Transparent",这个实际和2相同,但是不清楚原理的情况下比较容易想到这个方案

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? unity 解决视角拉近时看不见 吃了两天火锅闻着油味就想吐 安卓机qq群聊里怎么艾特一个人聊天 绿豆泥面膜会不会吧脸弄绿? 电脑屏保出现游戏广告如何删除? 华为手机顶部显示怎么设置 nginx/1.5.12 这个是什么意思 nginx/1.21.6是什么意思 智能电视和互联网电视有什么区别? 建微信群和群员说什么才好 美味十足,营养健康,味道不错、做起来也简单的几道家常菜有哪些? 麻辣鲜香爽口开胃,常吃补钙减肥美颜护肤的食物有哪些? 电炒锅打开一会就灯灭再开一会又灭 为什么电饭锅的灯总是一会亮一会不亮的是什么原因啊 能通过知道他在什么地方吗- 问一问 用码能定位他人的位置吗,怎么样用查别人的定位 化妆中都有哪些妆面呢?比如:欧式妆、舞台妆、印巴妆、伤疤妆之类? 推特电报群是什么 现代途胜暖风和空调怎么开 银行卡经常转账有影响吗- 问一问 tfboy是什么意思? 水动乐多少钱一瓶 水动乐饮料多少钱一瓶 台湾有卖水动乐吗 水动乐为什么不卖了 有哪些奥运会名言?我要多一些,要写是哪个人说的。 未来世界十大高楼是哪些 未来世界上最高的建筑物可能在哪个国家? 未来世界高楼5000米 wifi6ap和wifi5可以无缝漫游么 海澜优选里卖的胶囊咖啡机是什么牌子的 二进制的10是如何转换为十进制的2的? iphone4s手机驱蚊软件可以有驱蚊吗 iPhone的驱蚊软件有用吗 iphone驱蚊软件真的管用吗??? 电脑电炉发电机电铃,哪个是电源? iphone截屏怎样不用home键 B超提示双乳增生双腋下肿大淋巴结情况严重吗 腋下疼痛,检查B超说腋下淋巴结增大,有低烧,头晕头痛... B超提示双乳增生双腋下肿大淋巴结情况严重吗双乳增生