---
title: "unity的颜色线性空间下randTexture单个像素的色值大于shader的输出值的困惑"
author: "石心.Yong"
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/uwa-answer-linear-color-space-render-texture-value/
type: note
content_role: source
source_type: "source"
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/我的UWA问答/2020-09-05 - unity的颜色线性空间下randTexture单个像素的色值大于shader的输出值的困惑.md"
content_hash: f7870e58183213ff962646a61429f907f935149b7003f2f579dbc4b6fc9ad242
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 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)的公式为：

![image.png](/media/e362ba39a10d69082422.png)

where u is R, G, or B

- 回答时间：2020-09-05 02:32:23
- 最后更新：2020-09-06 01:26:44
- 采纳状态：未采纳

## 来源与关系

- 上位集合：[我的 UWA 问答](https://www.pystone.net/notes/my-uwa-answers/)
- UWA 标签：GPU、渲染模块、性能优化、终端平台、性能排查工具
- 原始问题：[unity的颜色线性空间下randTexture单个像素的色值大于shader的输出值的困惑](https://answer.uwa4d.com/question/5f51b8ba9424416784ef20d7)
- 源页最后更新：2020-09-05 02:32:23
