LWRP的UI渲染透明图片混乱问题

LWRP的UI渲染透明图片混乱问题

1)LWRP的UI渲染透明图片混乱问题
2)Unity物理中的Auto Sync Transform设置
3)关于Crunched ETC2的问题
4)UGUI中半透明图片透过背景图片穿透到桌面
5)给外包使用的Shader有没有办法加密


这是第177篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


SRP

Q:LWRP的UI渲染透明图片混乱问题,我建了个测试工程,可以复现出问题。
链接:https://pan.baidu.com/s/1eTj5Q7UpsUV-CW71-N4KnQ
提取码:sesd

先上图看我们遇到的问题:

场景中有一个3D摄像机和一个2D摄像机,可以看到右图圈中的图是半透明的,会直接透过UI看到场景里的物体。这是错误的显示效果。
我们使用的Unity版本是:2018.4.0
LWRP版本是:4.10.0

UI模式用的overlay方式渲染效果就没问题,用Camera渲染试就会出错。

A:看了一下LWRP的源码,找到如下代码块。


LWRP处理相机depth代码

LWRP的相机只有SKYBOX会处理depth相机,其它的都会做清除处理,我们自己加入UI相机相关的处理。最后通过改LWRP的源码解决,自己加入相机的depth处理。


更改后代码

这只是第一步,现在我们的UI还不能与3D界面做叠加,我们要在UI相机上做一下设置,如下图:


UI相机设置

到这步后,我们的UI就基本正常了。不过还是发现UI的元素有一些像素扩散,看起来就像是有点糊了。

这个是因为我们用的颜色空间是线性空间,我们图片一开始设计是在线性空间设计的,所以图片还要美术重新修改。对比原图的结果如下:


右边是原图,左边是游戏里的效果

回答来自题主的blog:https://blog.csdn.net/liaowuxing/article/details/100877932

感谢题主廖武兴@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d773bfcf6bfcf23aea6a6fd


Physics

Q:我们的手雷等投掷物是需要打开Auto Simulation的,我们尝试关闭Auto Sync Transforms,物体强行设置位置的时候手动调用SyncTransforms,性能数据没什么变化。

A:一般来说,只有在含有Collider的GameObject超级大量时,关闭Auto Sync Transforms才会有明显效果。对于物体模块不太使用的情况下,建议直接关闭Auto Simulation,一般情况下会给你带来很直观的性能耗时下降。

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d79c2b591262623a9fc7526


Texture

Q:Unity提供了Crunch压缩ETC2之后,我用2017试着压缩了一下,确实可以比原来Unity 5.6的ETC2格式打出来的AssetBundle包小很多,还是挺实用的。但有些问题查了一些资料好像也看不到,所以来请教一下:

1、Unity仅提供了RGBA Crunched ETC2格式,并没有RGB Crunched ETC2,所以全部用RGBA内存会比原来分别设置RGB和RGBA高一点,请问RGB是应该改用回RGB Crunched ETC吗?

2、Compressor Quality的50(Crunched是0-100进度条)可以理解为完全等于其它格式(Fast、Normal、Best)的Normal吗?



A:1、使用TextureImporter.DoesSourceTextureHaveAlpha()函数判断一下,有Alpha的就设置RGBA,没有的就设置RGB。

2、这个值越大表示它压缩后内存占用越大压缩时间越长,越小则占用越小时间越短。等不等同于Normal则未知了,毕竟是不同的压缩率。

如果你选ETC2,带A的是RGBA Compressed ETC2 8bits,不带A的就是RGB Compressed ETC2 4bits;选ETC2还是选Crunch,这还要看你对图片的质量要求,如果内存吃紧,对图质量要求尚可,那就用Crunch。

感谢李星@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d77149491262623a9fc74d9


UI

Q:Build Unity3D Android工程时,勾选Build Player中的Presever Framebuffer Alpha选项,使Unity3D背景透明。但是问题是UGUI中半透明图片会透过背景图片穿透到桌面,想问下大家之前遇到过类似这样的问题吗?还是需要安装到Android手机才会存在此问题?

相关工程例子链接:https://pan.baidu.com/s/1px0h8Kl0kKdeUFbO4AUJvw
提取码: 78du

A:这个现象应当是正确的,符合Unity的设计。保存帧缓存中的Alpha值并应用最上层的Alpha值。如图所示:

底层图片为(0,0,0,255)纯黑色,中间是个Alpha渐变的条状。在屏幕上显示的像素为条状RGB、黑色底色RGB、桌面背景RGB三种颜色进行Blend之后得到的RGB值,而A值为最上层条状图片的Alpha值。

如果想达到不穿透的效果,可以在UI的Shader中将Color Mask值改为14。这样条状Alpha值不会存储:

得到效果如下图所示:

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d7ef5fb91262623a9fc75a0


Shader

Q:外包制作贴图需要Shader来看效果,但又不想直接把Shader给外包,有没有办法可以在Unity中正常使用Shader,但不暴露Shader源代码?

A1:不能,Shader加密是一种伪需求,因为上层无论怎么加密,到底了显卡层都是一样的,如果其他人想看直接就可以通过一些GPU工具拿到。

坦白说,Shader并不值钱,并不需要特别加密。它真正的价值并不体现在表现力上,任何一种表现力都可以被复制,但复制它的制作流程很难。一个高品质、高效率的材质制作工艺流程,才是评价一个TA团队是否厉害的关键所在。
该回答由UWA提供

A2:如果只是防小白用户,可以把Shader写在C#里,编译成DLL来动态创建材质球的做法处理。
感谢Robot.Huang@UWA问答社区提供了回答

A3:1、用C#组建去控制调用Shader,把Shader语句以字符串的方式组织。
2、做一版简化版效果,以验证资源基础组织形式。

外包做的美术一般都比较粗糙,收包后还需要细节处理,制作简版的验证Shader足够支持量产外包效果验证了!

感谢debugger@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d80c87e91262623a9fc75e2

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)