关于ui:关于纹理勾选sRGB的疑惑

20次阅读

共计 3584 个字符,预计需要花费 9 分钟才能阅读完成。

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(原群已满员)

正文完
 0