unity的颜色线性空间下randTexture单个像素的色值大于shader的输出值的困惑
本文目录 3 个章节
unity的颜色线性空间下randTexture单个像素的色值大于shader的输出值的困惑
note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。
问题
这几天工程在进行粒子特效的性能检测,我们使用了uwa的ParticleEffectProfiler工具进行性能分析。在进行检测的时候发现一个问题,单个广告板的粒子overdraw为5,理论上应该是1的。我自己断点发现,虽然相机的shader片元输出颜色为fixed4(0.1, 0.04, 0.02, 0),但是在进性像素绘制次数计算的时候颜色的g = 0.2196......导致结算结果错误。后来向uwa反馈后,技术人员告诉我说把颜色空间改为gamma就好了,试验了一下,确实好了。但是我有困惑。
在线性空间下,shader返回的g值为0.04,为什么randerTexture的g值为0.2196.....,线性空间下颜色在显示器上显示的不应搞是0.04^2.2 <0.0016么,为什么会是0.2196....变大的值,难道显示器本身也进行gamam校正么?再有就是untiy颜色的线性空间和gamam空间是个什么样的逻辑,怎么感觉跟我学习的知识反着的,亦或者是我理解不到位。请各位大神帮忙解惑
- 提问者:阿祖的祖
- 提问时间:2020-09-04 19:47:06
我的回答
先简单解释一下,Unity的Color Space为Linear时,会在最后输出阶段,进行的伽马校正(gamma correction),将Linear空间的像素转换为sRGB空间。Gamma Correction会将颜色的亮度变大(补偿),Unity会将补偿后的像素值输出给显示设备(UWA的Effect Scanning工具会输出到RenderTexture上)。
因此,使用UWA当前版本的的特效检测功能,应该把项目的Color Space设置成Gamma。如果是Linear Space,计算得到的Overdraw率会偏高。
Gamma Correction( transform the linear values into sRGB)的公式为:

where u is R, G, or B
- 回答时间:2020-09-05 02:32:23
- 最后更新:2020-09-06 01:26:44
- 采纳状态:未采纳
来源与关系
- 上位集合:我的 UWA 问答
- UWA 标签:GPU、渲染模块、性能优化、终端平台、性能排查工具
- 原始问题:unity的颜色线性空间下randTexture单个像素的色值大于shader的输出值的困惑
- 源页最后更新:2020-09-05 02:32:23