初来乍到Indienova。好吧,其实不是初来乍到,我不太清楚怎么看自己的注册时间,但我确定我在很早以前就来了Indienova。应该是18年,那个时候我还在用Gamemaker Studio 2,还是初三,看的都是Indienova的教程。转眼高中三年,大学四年,虽然不能说这几年全都在做游戏,也不能说这几年真的在Indienova活跃过几天,但眼下早就换到了Unity,并且也开发出了《多元窗口》这样一部独特作品的早期试玩版,也该来这给我独立精神的启蒙之地分享点东西了。
虽然《多元窗口》现在有一个试玩版,但那不过只是为了验证游戏是否能在大多数人电脑上运行的一个技术测试版本而已。眼下,我还在做更多有意思的游戏内容。就在前不久,看到B站有位老师做了很独特的桌宠技术的演示视频。我本来就研究过窗口透明的相关技术,也有很多人早就研究过了这方面的内容,前不久就看到Indienova里有位大佬分享了他的桌面挂机游戏技术。但是我得说,这个视频里的URP透明可比一般的技术厉害多了,且听我慢慢道来。
Universal Render Pipeline算是新版本Unity主推的渲染管线,不仅在3D光照方面效果出众,甚至还有十分方便的2D灯光,光照系统可以很方便地补足美术上的不足,让游戏整体氛围感更加浓厚。下图是本人在之前制作的《ReRevue》,不仅利用了URP的2D光照,甚至很好的结合到了2.5D的视觉方案之中,利用光照和舞台概念掩盖了美术资源不足的问题。
不过,如果只是单纯的在一个普通的透明窗口游戏中导入URP并且能运行,那我也不会来这里写文章了。实际上,只有使用Unity自带的Built-in渲染管线才可以通过将相机背景设置为透明来实现透明窗口效果。在URP中,是不能直接这样去做的,还需要一些额外的设置。
在Urp老版本中(即低于14),可以直接看上面那个视频大佬的github项目。这里面已经相当完善了,在后处理前对颜色进行判断,如果检测到相机背景颜色,则输出alpha为0的颜色。不过由于老版本的URP太过拉跨,还涉及到了本地化UPR Package并修改Uber Post的操作。
在更加新的URP中,原项目中使用的Blit已经无法使用了,也不需要修改Uber Post了,但是还需要其他的修改。首先是关闭项目设置中的DXGI交换链,然后关闭相机与URP设置中的HDR选项(HDR无法最终输出透明)。然后利用新版本的Full Screen Render Feature,去制作一个全屏效果处理。
在这里,我利用了两个Shader来完成最终的效果。首先是TransparentWindow,我其实不太会Shader方面的内容,以前也没怎么用过,只会照葫芦画瓢。所以这里就是我用Shader Graph连连看搞出来的东西,功能也不过是比较颜色,然后如果检测到指定颜色(相机背景颜色),输出黑色透明像素(黑色是为了在编辑器中预览的时候方便排查,实际不需要,这里的colorMask确实重复了)。
而LimitedMaxAlpha则是针对一个很独特的情况进行的保险措施,经过测试,在渲染时,如果后处理中包含了更亮的颜色,例如十分强劲的泛光效果,新版URP会将最亮的颜色视为Alpha为1(即不透明),而其他像素的颜色会按比例下降Alpha值。这会导致一个结果,就是如果泛光之类的后处理太亮,会导致整个游戏不该透明的地方都透明了,而不是没有遮挡的地方透明,有遮挡的地方完全不透明。因此在后处理后利用了这个shader调整了整体的alpha值,使得无论后处理多么强劲,都维持alpha在合理的范围内。(其实我也不太清楚这个方案是否可以完全解决问题,只能说目前这个It just works,也有可能在其他情况下出现问题)
而代码方面,基本上就是简单的调用WindowAPI修改窗口样式,然后启用URP的透明输出。经过多次尝试,这里必然会导致窗口的标题栏消失。加上标题栏就会导致透明效果失效,暂时无法确定是什么原因导致的,但似乎只能这样去处理。如果需要保留标题栏的同时去实现URP透明效果,就不能有光影,可以使用GetLayeredWindowAttributes实现颜色剔除来解决问题。
最终效果演示,5个不同颜色的方块,以及较大的URP泛光。
差不多就是这些了,以上内容可能仍会在某些特定情况下产生问题,不过总体思路上就是如此。
未来也会试着在Indienova社区发布更多的内容,在《多元窗口》的制作过程中有着不断值得分享的内容。
暂无关于此日志的评论。