1)URP下与Built-in的Light Color不统一
2)开启MSAA的RenderTarget会对没开启MSAA的RenderTarget造成影响
3)角色Mesh合并的长处与毛病
4)NGUI渲染层级的原理
5)Unity上App图标装置到设施上图标含糊,设置上的留神点
这是第234篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Rendering
Q:发现Light的Intensity在不为1的状况下,光照的色彩在URP下滑Built-in管线下不统一。附件里有2个工程,应用Unity 2019.4.11f1,别离是URP和Built-in管线的(都是线性空间)。(附件可戳原问答下载)
再现办法:
1. 关上2边工程的Scene1,这个场景的方向光Intensity值设置为1。察看2个工程里球的光照色彩,是统一的,通过FrameDebugger也能够确认这一点。
2. 关上2边工程的Scene2,这个场景的方向光Intensity值设置为0.65。察看2个工程里球的光照色彩,Built-in管线的更暗,通过FrameDebugger也能够看到Built-in管线的工程光照色彩数值小一点。
URP色彩:
Built-in色彩:
URP FrameDebugger:
Built-in FrameDebugger:
A:用楼主Demo外面的Light的色彩做了一下计算,在Light设置项外面,Light Color为(0,202,255),202.0/255 = 0.792。SRP:
Green通道:
Mathf.GammaToLinearSpace(0.792) 0.65=0.5906189 0.65= 0.383902285Blue通道:
Mathf.GammaToLinearSpace(1) 0.65=1 0.65=0.65Built-in:
Green通道:
Mathf.GammaToLinearSpace(0.792*0.65)=0.2280943Blue通道:
Mathf.GammaToLinearSpace(0.65)=0.3800563应该是上面两段数值的计算区别:
GammaToLinearSpace(m_ColorFilter * m_Intensity);
GammaToLinearSpace(m_ColorFilter) * m_Intensity;查问发现是因为GraphicsSettings.lightsUseLinearIntensity这个数值不一样导致的。在SRP外面这个数值是True,在Built-in外面是False。
感激Xuan@UWA问答社区提供了答复
Rendering
Q:在同一帧中,我有用于渲染的RenderTarget开启了MSAA,和用于热扭曲成果的扭曲Buff,是一张没有开启MSAA的RenderTarget,在后处理中这张扭曲Buff会用来偏移UV,以实现扭曲成果。在PC上和iOS上一切正常,然而在Android真机上出现异常。在高通GPU上,这张扭曲Buff会导致屏幕呈现网格状的景象,在Mali GPU上会呈现各种细碎的小黑方块,应该是一个未知起因导致扭曲Buff上的数据被解决成我不冀望的状态。
如果我把其余的RenderTarget的MSAA敞开,这种景象就会隐没,也就说开启MSAA的RenderTarget会对没开启MSAA的RenderTarget造成影响,且仅仅是在Android真机上呈现,不同的GPU体现还不一样。有遇到相似问题的吗?求解。
A:该问题曾经解决了。我所遇到的问题的最终状况,不是开启MSAA的RenderTarget会对没开启MSAA的RenderTarget造成影响。在开启MSAA后,主相机的RenderTexture(MSAA)绑定到Shader上,会有相似如下操作:
texture(_Main_Tex, UV + Offset)
不晓得是Unity的Bug还是其余起因,导致在Android真机上,绑定到Shader上的RenderTexture肯定不是通过无效ResolveAA的版本,所以在如上操作的时候就出现异常体现,相似细碎方块或者网格等等景象,如果Offset是0,不会有异样体现,这些应该和Mobile GPU上的TBR有关系。
那么我须要在Android真机上传入一张通过无效ResolveAA的RenderTexture即可。通过验证,应用如下形式能够解决:
RenderTexture.Blit(Rt_msaa, Rt_no_msaa);
这样我就失去一张通过无效ResolveAA的Rt。
感激题主yangkang@UWA问答社区提供了答复
Rendering
Q:为了让身材各部件合并,所有部件都要开启Readable/Writable属性,合并也创立新的Mesh来合并,多个部件合并成一个Mesh有什么益处吗?
游戏类型是MMOARPG,比方能够换头发、脸、衣服等,资源量很大,如果不合并,走挂点的形式与合并成一个Mesh会怎么样呢?
A:第一个问题的益处应该就是不便合批,害处除了你说的几点,还有贴图的合并,这些点都会造成内存的额定开销。是否利用还是应该看具体的我的项目类型。第二个问题其实就是内存换Draw Call,看你们我的项目这两块哪一部分是瓶颈了。另外还须要留神材质,如果各部位材质差异很大也是无奈合批的。
感激范君@UWA问答社区提供了答复
NGUI
Q:Unity Shader判断层级关系的唯一标准是否是深度测试?我看NGUI的Shader并没有ZTest配置并且敞开了深度写入,那应该是依据渲染的先后顺序来管制层级?也就是说sortOrder sortLayerName renderQ camera depth都只是Unity在管制不同组件进入渲染流水线的程序吗?
A:深度测试在传统的渲染管线里,是产生在Fragment Shader之后(不思考Early Z等优化技术),用来剔除那些被遮挡的像素。自身和Draw Call提交的程序没有关系。Unity引擎中,有很多参数能决定渲染程序,也就是Draw Call提交程序。
首先最高优先级的是Camera,引擎中的渲染是由Camera发动的,在Built-in管线中,次要依附Camera的Depth来决定哪个Camera看到的物体先渲染。最常见的构造,比方Depth=0的相机画场景,另一个Depth=1的相机画UI。然而,当初URP里的相机的Camera Stack也是相似的构造,用来管制Camera的渲染先后顺序。
而后是RenderQueue,这个用来决定物体的渲染程序。例如,内置的Opaque和Transparent等等,具体能够看Unity的文档,这个值就是越小的物体越先画。同一个RenderQueue里,不同类型的物体渲染程序也是有肯定规定。比方,引擎默认的排序规定下Opaque的物体个别是从返回后渲染,而Transparent的物体为了保障渲染的正确性,是须要从后往前渲染的。
SortingLayer和OrderInLayer之类的次要用在UGUI Canvas上,能影响UI的渲染程序。
另外,问题中有提到UI的Shader中没有配置ZTest,敞开ZWrite,这也是失常的,具体开什么关什么,是要依据渲染的物体的类型决定的。因为UI排序个别由UI零碎外部的一些参数决定,是和深度无关的。惯例的一些通明物体也是会敞开ZWrite,只保留ZTest的。
感激范君@UWA问答社区提供了答复
Editor
Q:Unity上App图标装置到设施上图标含糊,设置上有什么特地留神的吗?
A1:请题主查下Unity的Import Settings,这个是对打在包里的图标文件也有作用的,能够将这些图标的Import Settings中的压缩去掉。
感激芭妮妮@UWA问答社区提供了答复
A2:补充一下,也须要留神自身图标的设置。咱们因为是导出工程,所以应用的图标资源其实是跟安卓版本统一有多个分辨率版本。
感激ZeaLotSean@UWA问答社区提供了答复
图片来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)