1)对于纹理勾选sRGB的纳闷
2)开启光照导致面片数减少
3)UGUI的Image批改材质属性疑难
4)UniWebView界面如何显示到Unity界面之后
5)Timeline的Internal_CreatePlayable开销很大
这是第254篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Rendering
Q:在UWA上搜到一个问答:https://answer.uwa4d.com/question/5bd1724fae74300ab0497bed,论断是:
linear space + gamma texture,勾sRGB
linear space + no gamma texture,不勾sRGB
如同Gamma Space上面这个sRGB勾不勾没有影响?
Player Setting外面的color space设置标识导入的图片是在Gamma Space中还是Linear Space中创立的,文档外面没有说分明,心愿大佬能够解释下。
依据这里的探讨:https://forum.unity.com/threads/confusion-about-gamma-vs-linear.496053,如果勾了sRGB之后Unity是做了gamma反改正,即tex2D进去的value应该是pow(origin_color_value, 2.2),这里假如gamma值是2.2,那么在frag中,R通道的值应该就是反改正过的,那么在heatmap的u的两头值应该是0.5左右,也就是下面那个探讨帖外面第一个headmap所示,但实际上却是第二个heatmap所示。
外面说是因为用color值做data而不是color的起因,这个解释太困惑了,因为不论做data还是做color,他们都是数字,数字的比拟是不会出错的。
A1:Gamma Space上面这个sRGB 勾不勾的确没有影响。
在Linear Space下,如果勾了sRGB 之后,Unity是做了Remove Gamma Correction。那么图中值为0.5灰度,即u=0.5的那一列的灰度,通过Remove Gamma Correction,失去的值是0.25,如下图所示:
X轴代表光照强度,Y轴代表灰度值蓝色线的Y值代表人眼的灰度值,视觉灰度值;红色线代表物理空间的理论灰度值,与光照强度成正比。
Photo突变图中u=0.5的那一列的灰度值为0.5,是视觉灰度值,通过Remove Gamma Correction之后,失去理论灰度值0.25。在Fragment Shader中参加计算。所以显示的是第二张heat map。
感激June@UWA问答社区提供了答复
A2:能够参考这篇文章:https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-24-importance-being-linear
说下我的了解:个别状况下,咱们看到的图片是在“显示器空间”,在显示器中看到的图片色彩是失常的,是因为这个图片自身是通过GammaCorrection的,就是原始的数值通过1/2.2次幂操作,对于这样的图片,咱们能够了解为是非线性的。在Unity抉择了Linear空间后,对于这样的非线性的图片,须要将其勾选sRGB能力正确地渲染。图片勾选sRGB后,在内存中的格局会变成ETC2_EAC_RGBA8_SRGB的格局(假如图片抉择ETC2 8bits的压缩格局),如下图:
不勾选sRGB,是ETC2_RGB8_UNORM格局,如下图:
对于这种_SRGB后缀的格局,GPU在进行纹理采样的时候,会主动将其移除GamaCorrection,行将数值做2.2次幂操作,然而不会对原始数据做批改。在Gamma空间中,不管勾选还是不勾选sRGB,格局都是ETC2_RGB8_UNORM。
说回题主的问题:在Gamma空间中,渲染出的后果是均等的4种颜色,因为在Gamma空间中,是不会做移除GammaCorrection操作的,这阐明,这个“非线性图片”在u=0.5的时候(u是纹理uv坐标),纹理中的data value=0.5,当变成了Linear空间后,data没有发生变化,还是在u=0.5的时候data=0.5,勾选了sRGB后,在进行纹理采样的时候,GPU将值做了2.2次幂操作,就变成了0.25左右,因而当u<=0.5的时候,color.r<=0.25,依据Shader计算color.r<0.25时都是红色,即u<=0.5时,都是红色,于是就有一半色彩都是红色了。
感激Xuan@UWA问答社区提供了答复
Rendering
Q:Unity显示的面数,应该是这一帧上传到GPU的所有顶点数据所决定的,那为什么GPU不会对这部分做个缓存呢?因为开启光照时,面数减少,相当于屡次上传了模型的顶点数据,这部分如果缓存下来,不是能够晋升很大性能吗?如果GPU不能做这个缓存,是不是说GPU的缓存太小,没有这个空间,或者是GPU并不能确认哪些要缓存?如果是改引擎代码,能够针对我的项目去做缓存。
A:光照自身着色不会影响DrawCall和面数。实时暗影须要在渲染一张暗影用深度图,相当于换了个视角进行渲染,数据有别于以后相机。能够开FrameDebugger看一下整个渲染过程。
感激StriteR@UWA问答社区提供了答复
UGUI
Q:UGUI的Image能通过设置MaterialPropertyBlock来批改材质属性吗?怎么设置?
A:UGUI用不了材质块,能够参考:
https://forum.unity.com/threads/big-problem-with-lacking-materialpropertyblock-for-ui-image.506941
感激范世青@UWA问答社区提供了答复
UGUI
Q:有一个安卓端显示网页的插件UniWebView,默认会显示到Unity界面的下层,挡住Unity所有的显示。请问怎么让安卓的原生界面成为背景,让Unity的UI成为前景,Unity的背景自身也要通明。
A:要让UniWebView跑到Unity界面前面去,官网文档上说是不行的。
https://docs.uniwebview.com/guide/faq.html对于Unity背景透明度放弃,在Player Settings外面有个勾选项应该能够达到目标。
感激Xuan@UWA问答社区提供了答复
Playable
Q:咱们的特效是应用Timeline进行制作的,最近进行性能测试的时候发现,Internal_CreatePlayable办法的开销很大,然而只有一个轨道,所以很蛊惑这个开销跟什么无关?
我在PC上加载了同样的一个对象,Internal_CreatePlayable须要18.55ms,而后我在PC上创立了Cube加了一个Timeline成果,Internal_CreatePlayable就须要4ms左右。
A:Timline首次CreatePlayable就是比拟耗时,我这边一个简略的Timeline资源首次耗时500+ms。
不过能够通过把CreatePlayable的步骤放在场景加载时进行来防止游戏过程中的卡顿。加载Timeline资源后,调用PlayableDirector.RebuildGraph就会进行CreatePlayable,相当于Prewarm。尔后,再调用Play(),就不会进行CreatePlayable。再调用RebuildGraph,因为有了缓存,也不会有高耗时。
下图为首次调用RebuildGraph的耗时。
下图为第二次调用RebuildGraph的耗时。
感激Prin@UWA问答社区提供了答复
封面图来源于:URP Learn
一个用于学习Unity Universal Render Pipeline的我的项目。
https://lab.uwa4d.com/lab/6010aca80f247485d9c39878
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)