【Gamma的由来】

首先,要区分照度和亮度,照度是一个客观的量,亮度是一个主观的量,不同的人看相同照度的物体所感受到的亮度是不一样的。对于照度线性变化的物体,人眼感受到的亮度不是线性的。人眼对于低照度的物体更敏感,这意味着对于照度为2、3、4的三个物体,人眼能够区分,而对于照度为222、223、224的三个物体,人眼不能区分。

研究表明,人眼感受到的亮度与线性增长的物体照度之间的关系近似为幂指数关系,如下:

人眼感受到的亮度 = 物体照度^n  (公式一)

其次,我们存储颜色的空间是有限的(也即灰度阶级有限),常用的RGBA32格式,每个颜色通道只有8位,最多能表示256种照度,而现实世界中的照度远超256。基于人眼对照度的感知特点,我们不能线性的去表示照度,需要表示出更多的低照度,以便人眼能分辨出更多的物体细节。

反过来的意思是:当我们用摄像机拍照时,很多低照度的物体的照度值被存储下来,根据公式一可以得到:

存储的值 = 物体的照度值^(1/n)   (公式二)

这个n就是gamma值,其值到底为多少呢?

在8位图上,能表示的照度有256种,也即灰度有256阶,换算到0~1区间,0是黑,255是白,128为中间灰度,这个中间灰度要让人眼感觉为0.5,这样人眼看起来的灰度是均匀渐变的,如下图所示。

人眼感觉为0.5时对应的物理照度=0.218*人眼感觉为1时对应的物理照度。pow(0.5,2.2) = 0.218。这个就是Gamma = 2.2的由来。

那么0.218是怎么来的?人眼感受的亮度是主观的,不同的人感受到的不同,这个值得由很多人测试而来。1996年微软和惠普在特定的光照条件下测试人观看显示器的感受,他们认为,把8位图像中128号灰(0.5灰)这个抽象的、代表心目中中灰色的数值,对应以白像素21.8%的亮度显示出来,由黑到白的渐变过渡看起来会比较均匀。因此gamma被确定为2.2最合适,尽管gamma可以在2.2上下浮动。

最后,屏幕的照度与输入的电压不是线性关系,两者近似为2.2次幂的关系最为合适。例如输入的电压为0.5(输入的电压近似等于存储的值),屏幕的照度为pow(0.5,2.2) = 0.218,恰好0.218时人眼感觉的亮度为0.5。这就是反过来的公式二:

屏幕的照度 = 存储的值^2.2  (公式三)

因此,早期的阴极摄像管(CRT)显示器中,会使得屏幕的照度与输入的电压为2.2次幂的关系。其中,2.2为CRT显示器的gamma值,又被称为display gamma。不同的显示器的屏幕照度与输入电压的关系不同,gamma值也不同。不过厂商一般会尽量将生产显示器的gamma值向2.2靠近,现代的显示器的gamma值甚至可以调整,而不是像以前一样出厂就固定。

【什么是Gamma校正】

综上所述,从摄像机拍摄真实场景到在显示器上显示图像,经历了如下图所示的过程:真实场景的照度经过encoding gamma得到存储的值,存储的值经过display gamma得到显示器的照度。

整个系统的 view gamma = encoding gamma * display gamma

如果view gamma = 1,则计算可得真实场景的照度 = 显示器的照度,这正是我们所期望的,这样显示器才能真实的表现出真实场景的照度。

那么是不是只要view gamma =1 ,encoding gamma 的值任意都可以呢?不行,因为这样保存下来的值会缺失很多照度信息,如下图所示,使用不同的encoding gamma会导致我们在屏幕上看到的画面与人眼对着真实场景看到的画面不一致。

如果图像是通过相机生成的,必然做了encode gamma,如果图片是由计算机生成的,那么在保存为图片文件时,需要手动做encode gamma,这就是gamma校正

如果不进行gamma校正,那么经过display gamma后,也即decode gamma后,屏幕的照度会比预想的低,导致整个画面看起来比较暗。

【sRGB空间】

在unity中的纹理有sRGB的选项,默认是勾选的,表示纹理是在sRGB空间

sRGB空间,也叫sRGB色域,是一个通用的标准色域,是由微软、惠普主导制定出来的标准色彩空间,意在让显示器、数位相机、扫描仪、投影仪等各种计算机外部设备与应用软件对于色彩有一个共通的语言。显示设备能够覆盖的sRGB范围越大,显示的颜色就更加丰富饱满。

sRGB空间对应的就是gamma为0.45的空间,也即采用这个空间的图片都做过gamma校正。

unity中有线性空间linear space和伽马空间gamma space,选择不同的空间表明我们的输入和输出是在不同的空间中。而在Shader中颜色插值、光照的计算等都是在线性空间中进行的。

unity中默认是伽马空间,需要将在sRGB(gamma0.45)中的纹理变为在线性空间中的纹理(gamma 1.0),计算出来结果后,需要再做gamma校正,变回sRGB空间,再送到屏幕上。

如果选择了线性空间,如果纹理是sRGB,那么同样需要变为线性空间,如果纹理是linear,那么不需要变为线性空间。我们可以通过上图所示的来设置纹理是哪个空间下的。

【gamma的影响】

因为我们在的计算都是在线性空间下进行了,而我们电脑上保存的文件都是在sRGB空间下的,所以我们不能直接用图片存储的值来进行计算,在用值计算前,必须先做gamma校正,否则我们计算的结果呈现到屏幕时会出现黑边等。下面的视频很好的解释了这一现象

Computer Color is Broken - YouTube

【真彩色与位深度】

我们常见的RGB图片,包括上文说的RGBA格式图片,每个通道用8位表示,其位深度为8,所能表示的颜色为256种。如果用16位表示一个通道,那么可以表示的颜色有65536种。如果用32位表示一个通道,即位深度为32,那么可以表示的颜色有16777216种,远超人眼所能分辨的颜色。

位深度为32的图像即为真彩色图像。

真彩色图像没有灰度等级的限制,能够完整的记录真实物体的照度,只要view gamma为1,encode gamma可以任意了。

【参考】

色彩校正中的Gamma(人眼亮度感应的非线性)_所心即所想的博客-CSDN博客_人眼亮度感知曲线

对 Gamma 校正的个人理解 - 知乎 (zhihu.com)

如何理解Gamma校正? - 掘金 (juejin.cn)

Gamma correction - Wikipedia

Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗? - 知乎 (zhihu.com)

8位, 16位,24位,32位图片显示原理及对比_csdn66_2016的博客-CSDN博客_32位图像

对Gamma校正的理解相关推荐

  1. 理解gamma校正[译]

    原文: https://www.cambridgeincolour.com/tutorials/gamma-correction.htm 这篇文章是我读过的讲gamma讲的最清楚.最易懂的,来龙去脉简 ...

  2. OpenGL Gamma校正 (Gamma Correction)

    OpenGL Gamma校正 Gamma校正简介 Gamma校正 sRGB纹理 Gamma校正简介 当我们计算出场景中所有像素的最终颜色以后,我们就必须把它们显示在监视器上.过去,大多数监视器是阴极射 ...

  3. Unity Gamma校正转为线性空间

    相信大部分了解图形学的人,都听说过Gamma校正或者Gamma空间,线性空间这些词.这里不对Gamma Space形成的历史原因做过多描述.Gamma和Linear空间的一些原理,文章也很多,包括Un ...

  4. OpenGL核心技术之Gamma校正

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  5. Gamma校正与线性空间

    基础知识部分 为了方便理解,首先会对( Luminance )的相关概念做一个简单介绍.如果已经了解就跳到后面吧. 我们用Radiant energy(辐射能量)来描述光照的能量,单位是焦耳(J),因 ...

  6. Gamma Correction/Gamma校正/灰度校正/亮度校正(已更正) - 部分 DCC 中的线性工作流配置

    文章目录 也可以简单参考 SIGGRAPH 2010 的 PBS 的 Gamma-Correct Unity 中的 gamma.linear 工作流 Unity BRP 管线中的 shaderlab ...

  7. OpenGL(十八)Gamma校正 色域 与 HDR

    通常来说,在不同设备上看到的颜色是不同的.其中最常提及的概念是高动态光照渲染(High-Dynamic Range,简称 HDR ).它可以使图像在亮度的表现上更丰富.这篇文章讨论设备颜色和校正的相关 ...

  8. gamma校正到底是个什么玩意儿

    一. 在哪见过.听说过Gamma? * 还用说,Adobe Gamma * 常听说MAC的默认Gamma是1.8,PC的是2.2 * 我的显卡驱动程序里有Gamma调节 * 我下载了一个软件,也可以调 ...

  9. 关于视频播放的伽马——gamma校正

    关于视频播放中的gamma 我们在做视频播放器过程中经常会看到有的播放器有gamma调整,通过gamma调整也能明显觉察到视频图像颜色亮度等变化,但gamma对普通用户太专业难懂,即时对开发人员来说g ...

  10. OpenCV 【十】——Gamma校正 ——图像灰度变化

    Gamma校正(C++.OpenCV实现) 1.作用: Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: 伽玛校正由以下幂律表达式定义: 2.函数原型 v ...

最新文章

  1. 从0梳理1场NLP赛事!
  2. 如何用C#语言构造蜘蛛程序
  3. 电机贴上锡纸到底有没有作用?
  4. 通过poi的XSSF实现生成excel文件
  5. 固定顶部指定div不滑动
  6. 简单排序--插入排序
  7. 工作214:结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component
  8. ASP.NET MVC中使用Autofac实现简单依赖注入
  9. 小兔的棋盘(HDU-2067)
  10. 20179209《Linux内核原理与分析》第一周作业
  11. Android JNI 自定义对象为参数和返回值
  12. 计算机字体库被删了,win7系统下word字体库不想要的字体如何删除
  13. 解除开启全局 UWP应用网络隔离限制
  14. 基于改进注意力机制的U-Net模型实现及应用(keras框架实现)
  15. 诛仙3服务器查询系统,《诛仙3》4月1日服务器数据互通公告
  16. WXPY BOT()扫码登陆微信失败 报错KeyError: ‘pass_ticket‘
  17. Java-c3p0原生写法
  18. python初级学习
  19. 读《About Face 4 交互设计精髓》8
  20. 自定义8583模板,打包解包,使用j8583包有改动

热门文章

  1. 绝了!kafka权威指南
  2. mtkwin10驱动_联发科MTK刷机驱动(支持WIN10)驱动
  3. 【行业专题报告】家电、白电、黑电-专题资料
  4. psasp 问题记录
  5. 长ping 命令,检测网络连接状态
  6. 一个完整的测试计划模板
  7. 网课题库接口(免费)高准确率
  8. eclipse安装教程2020版(解决官网下载的安装包打开无响应的问题)
  9. unity3D 移动开发代码优化
  10. 软考初级-程序员了解