当前位置: 首页 > news >正文

[自学记录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游资网 

相关文章:

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

一、前言 Gamma矫正其实也属于我前面落下的一块内容,打算把它补上,其它的没补是因为我之前写的GAMES101笔记里已经涵盖了,而Gamma矫正在101里面确实没提到,于是打算把它补上,这块内容并不难,但是想通透的理…...

【数据结构】二叉树链式结构的实现及其常见操作

目录 1.手搓二叉树 2.二叉树的遍历 2.1前序、中序以及后序遍历 2.2二叉树的层序遍历 3.二叉树的常见操作 3.1求二叉树节点数量 3.2求二叉树叶子节点数量 3.3求二叉树第k层节点个数 3.3求二叉树的深度 3.4二叉树查找值为x的节点 4.二叉树的销毁 1.手搓二叉树 在学习…...

从零实战SLAM-第九课(后端优化)

在七月算法报的班,老师讲的蛮好。好记性不如烂笔头,关键内容还是记录一下吧,课程入口,感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…...

Python Opencv实践 - 图像金字塔

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像上采样 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #参考资料:https://blo…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…...

计算机竞赛 python+大数据校园卡数据分析

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖&am…...

DNNGP模型解读-early stopping 和 batch normalization的使用

一、考虑的因素(仅代表个人观点) 1.首先我们看到他的这篇文章所考虑的不同方面从而做出的不同改进,首先考虑到了对于基因组预测的深度学习方法的设计 ,我们设计出来这个方法就是为了基因组预测而使用,这也是主要目的&…...

【目标检测】目标检测 相关学习笔记

目标检测算法 PASCALVOC2012数据集 挑战赛主要分为 图像分类 目标检测 目标分割 动作识别 数据集分为四个大类 交通(飞机 船 公交车 摩托车) 住房(杯子 椅子 餐桌 沙发) 动物(鸟 猫 奶牛 狗 马 羊) 其他&a…...

面试攻略,Java 基础面试 100 问(十六)

反射使用步骤(获取Class对象、调用对象方法) 获取想要操作的类的Class对象,他是反射的核心,通过Class对象我们可以任意调用类的方法。 调用 Class 类中的方法,既就是反射的使用阶段。 使用反射 API 来操作这些信息。 什么是 java 序列化&…...

章节5:脚本注入网页-XSS

章节5:脚本注入网页-XSS XSS :Cross Site Script 恶意攻击者利用web页面的漏洞,插入一些恶意代码,当用户访问页面的时候,代码就会执行,这个时候就达到了攻击的目的。 JavaScript、Java、VBScript、Activ…...

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…...

迅捷视频工具箱:多功能音视频处理软件

这是一款以视频剪辑、视频转换、屏幕录像等特色功能为主,同时附带有视频压缩、视频分割、视频合并等常用视频处理功能为主的视频编辑软件。该软件操作简单易用,即使没有视频处理经验的用户也可以轻松上手。将视频添加到工具箱对应功能后,简单…...

linux--fork()详解

fork() 参考链接:链接 进程控制原语包括:进程的建立、进程的撤销、进程的等待和进程的唤醒。 fork,在英语用译为叉子,形状像Y,反过来就如下图: 就是本来只有一个进行app,然后它调用了fork()函数&#xf…...

go_并发编程(1)

go并发编程 一、 并发介绍1,进程和线程2,并发和并行3,协程和线程4,goroutine 二、 Goroutine1,使用goroutine1)启动单个goroutine2)启动多个goroutine 2,goroutine与线程3&#xff0…...

第一百一十五回 权限管理包permission_handler

文章目录 概念介绍使用方法示例代码经验分享 我们在上一章回中介绍了局部动态列表相关的内容,本章回中将介绍权限管理包 permission_hanadler.闲话休提,让我们一起Talk Flutter吧。 概念介绍 权限是使用某种功能的授权,比如使用手机上的相机…...

【机器学习】sklearn数据集的使用,数据集的获取和划分

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 sklearn数据集 二、安装sklearn二、获取数据集三、…...

Mysql之 optimizer_trace 相关总结

Mysql之 optimizer_trace 相关总结 MySQL官网介绍:https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_OPT_TRACE.html 1. 简介 MySQL优化器可以生成Explain执行计划,通过执行计划查看sql是否使用了索引,使用了哪种索; 但…...

【Linux命令详解 | wget命令】 wget命令用于从网络下载文件,支持HTTP、HTTPS和FTP协议

文章标题 简介一,参数列表二,使用介绍1. 基本文件下载2. 递归下载整个网站3. 限制下载速率4. 防止SSL证书校验5. 断点续传6. 指定保存目录7. 自定义保存文件名8. 增量下载9. 使用HTTP代理10. 后台下载 总结 简介 在编程世界中,处理网络资源是…...

DockePod信号处理机制与僵尸进程优化

Docke&Pod信号处理与僵尸进程优化 容器与信号的关系 SIGTERM信号:程序结束(terminate)信号,这是用来终止进程的标准信号,也是 kill 、 killall 、 pkill 命令所发送的默认信号。与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程…...

NetApp StorageGRID 对象存储,使您能够跨公有、私有云和混合多云环境管理非结构化数据

NetApp StorageGRID 对象存储,使您能够跨公有、私有云和混合多云环境管理非结构化数据 主要优势 智能:了解行业领先的数据生命周期管理软件。 • 借助 NetApp StorageGRID 基于对象的存储解决方案的数据管理功能、您可以从大型非结构化数据中获得高价值…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

MMaDA: Multimodal Large Diffusion Language Models

CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

SpringAI实战:ChatModel智能对话全解

一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM&#xff0…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...