[自学记录06|*百人计划]Gamma矫正与线性工作流

一、前言

Gamma矫正其实也属于我前面落下的一块内容,打算把它补上,其它的没补是因为我之前写的GAMES101笔记里已经涵盖了,而Gamma矫正在101里面确实没提到,于是打算把它补上,这块内容并不难,但是想通透的理解我觉的还是有难度的,尤其是关于Gamma矫正,它的原理其实很简单,就是1-1=0,但是想要完全解释的明白我觉得还是有一定困难,而且网上的绝大部分的资料讲解的有一定误导性,也可能是我理解的有问题,并不是说他们说错了,而是他们讲解的很容易让人产生困惑和疑问以及误区,包括我自己也是,所以结合我自己所理解的,打算把这块跟大家说明白。(本篇不全是百人的内容)


二、线性空间与Gamma空间

相信大家都看过这张图,我也就不卖关子了,上面那一条是人眼觉得均匀的变化的亮度(Gamma空间),下面那一条是实际上真实世界物理上的均匀变化的亮度(线性空间)。

简单点说人眼感知的均匀物理上的均匀是不一样的,人眼对暗部变化感受明显,对亮部变化感受不明显。我们把它们两个均匀之间做一个映射就会得到这么一条曲线如下图。


三、Gamma矫正

上图就是Gamma矫正的过程,之间用一个传递函数来作为线性空间和Gamma空间之间的映射转换,V_{out}=V{_{in}}^{^{1/gamma}}V_{out}=V{_{in}}^{^{gamma}}

你可能会问,我们要的不就是人眼看着均匀变化吗?为什么不直接把第一张图的结果拿出来显示在屏幕上呢?

这里是一个思维误区,虽然图像显示在屏幕上了,但是屏幕上的图像还要经过你的眼睛然后变成视觉信号进入你的大脑皮层,你的眼睛自带非线性映射功能,所以你才会觉得第一张图“异常的亮”,因为它被“提亮”了两次。也就是说虽然我们以我们的眼睛为标准,但是我们更希望看到的是线性空间,因为眼睛自带转换功能,也正是因为这样,我们往往觉得白天的时候非常的亮,而较黑的地方很少。


四、为什么要进行Gamma矫正

我们现在常用的为sRGB颜色空间,也就是传递函数gamma=2.2的颜色空间。而常用的存储格式RGBA32格式,每个通道只有8位存储,也就是0~255这个范围,这显然不能表现出所有的线性空间的亮度值,于是我们打算为我们的眼睛着想,存储Gamma空间也就是我们人眼认为均匀的值。我们前面说了人眼对暗部感受明显,对亮部感受不明显,所以我们打算牺牲亮部而多存储暗部的值,这也就是我们前面提到的映射曲线的原理。

关于另一个早期CRT阴极显像管显示器的电压和屏幕亮度承次幂关系的原因我并不想提,因为现在的显示器已经没有这个问题了,而且说完这个会有很多误解和问题,混乱和迷惑,因为你很难将这个与前面的原因联系起来,所以既然CRT显示器已经被淘汰了,咱们也就不用管了,感兴趣的朋友可以自己看看,这里就不具体说了。


五、线性工作流

线性工作流存在的意义就是确保我们在屏幕上看到的亮度永远是正确的符合物理真实世界的。因此当涉及到渲染和光照计算,我们都会在线性空间完成,这样才能确保计算结果正确。我举两个例子:

1.假设我弄了一张在Gamma空间下亮度为0.5的图,那么当它在显示器上显示时,它的实际亮度应该是0.218,这个时候如果我想对它做亮度乘以2的这么一个操作,如果在Gamma空间下的话,它的亮度就变成了1,然后经过显示器的矫正变为线性空间时它仍然是1,但是这是错误的,我们应该在线性空间下进行计算,也就是说在对这张图进行亮度翻倍的操作时应该先把它映射到线性空间,这样0.218*2=0.436,然后变换会Gamma空间,经显示器再变换回线性空间,这样得到的结果是0.436,才是正确的亮度。

2.再举一个渲染器的例子,渲染器它是物理模拟渲染的,也就是说再渲染器里,光线是线性空间的,但如果我们的贴图没有经过处理,直接丢进渲染器进行计算,实际上贴图是在Gamma空间中的,这显然是错误的,我们应该先对贴图处理把它映射到线性空间然后再丢进渲染器和光线运算,这样得出的结果才是正确的。使用Shader时也是一样。


六、Unity中的颜色空间 

当选择Gamma Space时,Unity不会做任何处理。当选择Linear Space时,引擎的渲染流程则会在线性空间计算 。

理想情况下项目使用线性空间的贴图颜色,不需要勾选贴图上的sRGB选项,如果在贴图选项上勾选了sRGB的选项,Unity则会通过硬件特性在采样时进行线性转换。

 

主要由两个硬件特性来支持

sRGB Frame Buffer

  • 将Shader的计算结果输出到显示器前做Gamma校正
  • 作为纹理被读取时会自动把存储的颜色从sRGB空间转换到线性空间
  • 调用ReadPixels()、ReadBackImage()时,会直接返回sRGB空间下的颜色
  • sRGB Frame Buffer只支持每通道为8bit的格式,不支持浮点格式
  • HDR开启后会先把渲染结果绘制到浮点格式的Frame Buffer中,最后绘制到sRGB Frame Buffer上输出。

sRGB Sampler

  • 将sRGB的贴图进行线性采样的转换。

使用硬件特性完成sRGB贴图的线性采样和shader计算结果的gamma校正,比起在shader里对贴图采样和计算结果的校正要快。


七、资源导出问题

1.Substace Painter

Substace Painter贴图导出时是Gamma空间,颜色偏亮,所以导入到Unity时要把贴图的sRGB选项勾选上,把它返回线性空间。

2.PhotoShop

如果使用线性空间,一般来说Photoshop可以什么都不改,导出的贴图只要勾上sRGB就可以了。你也可以调整PhotoShop的伽玛值为1,导出的贴图在Unity中也不需要勾选sRGB了。

PhotoShop对颜色管理特别精确,Unity里看到的颜色要经过显示器的伽玛变换,而PhotoShop不会,PhotoShop会读取显示器的Color Profile,反向补偿回去。

PhotoShop有第二个Color Profile,叫做Document Color Profile。通常它的默认值就是sRGB Color Profile,和显示器的Color Profile一致,颜色是被这个Color Profile压暗了,所以PhotoShop中看到的结果才和Unity中一样。

线性空间中的半透明图片制作

Photoshop的图层和图层之间做混合的时候,每个上层图层都经过了伽马变换,然后才做了混合,这个方式是设置中的默认值。你需要在设置中更改它,选择“用灰度系数混合RGB颜色”,参数设置为1,这样图层直接就是直接混合的结果。(sRGB编码是为了增加8位颜色的精度,如果你是用了32位浮点数的贴图格式,PhotoShop自动使用的是线性空间,没有做任何伽玛变换的)


参考

2600_伽马校正1_哔哩哔哩_bilibili

2600_伽马矫正 (qq.com)

Gamma校正与线性工作流入门讲解_哔哩哔哩_bilibili

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

Unite 2018 | 浅谈伽玛和线性颜色空间 - GameRes游资网 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/76955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 wxPython和ECharts生成和保存HTML图表

使用wxPython和ECharts库来生成和保存HTML图表。wxPython是一个基于wxWidgets的Python GUI库,而ECharts是一个用于数据可视化的JavaScript库。 C:\pythoncode\blog\echartshow.py 参考网址:https://echarts.apache.org/v4/examples/zh/index.html 安装…

2023最新水果编曲软件FL Studio 21.1.0.3267音频工作站电脑参考配置单及系统配置要求

音乐在人们心中的地位日益增高,近几年音乐选秀的节目更是层出不穷,喜爱音乐,创作音乐的朋友们也是越来越多,音乐的类型有很多,好比古典,流行,摇滚等等。对新手友好程度基本上在首位,…

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRLSTM长短期记忆神经网络分位数回归时间序…

解决内网GitLab 社区版 15.11.13项目拉取失败

问题描述 GitLab 社区版 发布不久,搭建在内网拉取项目报错,可能提示 unable to access https://github.comxxxxxxxxxxx: Failed to connect to xxxxxxxxxxxxxGit clone error - Invalid argument error:14077438:SSL routines:SSL23_GET_S 15.11.13ht…

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢复PMCR_EL0可能会泄露安全世界的时间信息 CVE ID CVE-2017-1503…

支持https访问

文章目录 1. 打开自己的云服务器的 80 和 443 端口2. 安装 nginx3. 安装 snapd4. 安装 certbot5. 生成证书6. 拷贝生成的证书到项目工作目录7. 修改 main.go 程序如下8. 编译程序9. 启动程序10. 使用 https 和端口 8081 访问页面成功11. 下面修改程序,支持 https 和…

Rust软件外包开发语言的特点

Rust 是一种系统级编程语言,强调性能、安全性和并发性的编程语言,适用于广泛的应用领域,特别是那些需要高度可靠性和高性能的场景。下面和大家分享 Rust 语言的一些主要特点以及适用的场合,希望对大家有所帮助。北京木奇移动技术有…

分布式 - 消息队列Kafka:Kafka 消费者的消费位移

文章目录 01. Kafka 分区位移02. Kafka 消费位移03. kafka 消费位移的作用04. Kafka 消费位移的提交05. kafka 消费位移的存储位置06. Kafka 消费位移与消费者提交的位移07. kafka 消费位移的提交时机08. Kafka 维护消费状态跟踪的方法 01. Kafka 分区位移 对于Kafka中的分区而…

Linux系统安装Google Chrome

1.进入谷歌浏览器官网 Google Chrome - Download the Fast, Secure Browser from GoogleGet more done with the new Google Chrome. A more simple, secure, and faster web browser than ever, with Google’s smarts built-in. Download now.http://www.google.cn/intl/en_…

rust入门系列之Rust介绍及开发环境搭建

Rust教程 Rust基本介绍 网站: https://www.rust-lang.org/ rust是什么 开发rust语言的初衷是: 在软件发展速度跟不上硬件发展速度,无法在语言层面充分的利用硬件多核cpu不断提升的性能和 在系统界别软件开发上,C出生比较早,内…

零售行业供应链管理核心KPI指标(三)

完美订单满足率和退货率 完美订单满足率有三个方面的因素影响:订单按时、足量、无损交货。通常情况下零售企业追求线上订单履行周期慢慢达到行业平均水平,就是交付的速度变快了,这个肯定是一件好事情,趋势越来越好。 同时&#…

周期 角频率 频率 振幅 初相角

周期 角频率 频率 振幅 初相角 当我们谈论傅里叶级数或波形分析时,以下术语经常出现: 周期 T T T: 函数在其图形上重复的时间或空间的长度。周期的倒数是频率。 频率 f f f: 周期的倒数,即一秒内波形重复的次数。单位通常为赫兹&#xff…

【NLP】训练LLM的不同方式

一、说明 在大型语言模型(LLM)领域,有各种各样的 训练机制,具有不同的手段,要求和目标。由于它们服务于不同的目的,因此重要的是不要将它们相互混淆,并了解它们适用的不同场景。 在本文中&#…

JavaWeb-Listener监听器

目录 监听器Listener 1.功能 2.监听器分类 3.监听器的配置 4.ServletContext监听 5.HttpSession监听 6.ServletRequest监听 监听器Listener 1.功能 用于监听域对象ServletContext、HttpSession和ServletRequest的创建,与销毁事件监听一个对象的事件&#x…

智能数据建模软件DTEmpower 2023R2新版本功能介绍

DTEmpower是由天洑软件自主研发的一款通用的智能数据建模软件,致力于帮助工程师及工科专业学生,利用工业领域中的仿真、试验、测量等各类数据进行挖掘分析,建立高质量的数据模型,实现快速设计评估、实时仿真预测、系统参数预警、设…

什么是LAXCUS分布式操作系统?

相较Linux、Windows,Laxcus是同时在多台计算机上运行的操作系统,处理大规模、高并发、高性能业务,其特点是资源共享和任务并行,并实现【数存算管】超融合一体化。环境中的资源:CPU、GPU、内存、硬盘、网络,…

C++之类之间访问函数指针(一百八十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

k8s 自身原理之高可用

说到高可用,咱们在使用主机环境的时候(非 k8s),咱做高可用有使用过这样的方式: 服务器做主备部署,当主节点和备节点同时存活的时候,只有主节点对外提供服务,备节点就等着主节点挂了…

如何用树莓派Pico针对IoT编程?

目录 一、Raspberry Pi Pico 系列和功能 二、Raspberry Pi Pico 的替代方案 三、对 Raspberry Pi Pico 进行编程 硬件 软件 第 1 步:连接计算机 第 2 步:在 Pico 上安装 MicroPython 第 3 步:为 Thonny 设置解释器 第 4 步&#xff…

单片机第一季:零基础13——AD和DA转换

1,AD转换基本概念 51 单片机系统内部运算时用的全部是数字量,即0 和1,因此对单片机系统而言,无法直接操作模拟量,必须将模拟量转换成数字量。所谓数字量,就是用一系列0 和1 组成的二进制代码表示某个信号大…