Unity中的伽马(Gamma)空间和线性(Linear)空间

news2024/7/4 4:53:30

伽马空间定义:通常用于描述图像在存储和显示时的颜色空间。在伽马空间中,图像的保存通常经过伽马转换,使图片看起来更亮。

gamma并不是色彩空间,它其实只是如何对色彩进行采样的一种方式

为什么需要Gamma:

在游戏业界长期以来都忽视一个伽马矫正的问题,这就导致渲染出来的效果要么过曝,要么过暗,总是和真实世界不同。

尽管是使用了同一shader渲染,但选择颜色空间不同和处理gamma矫正时做法不同,就导致结果不同

CRT的亮度和施加电压不成线性

人眼和响应不成线性

unity中可以在此处选择不同的颜色空间,如图

 一、Gamma空间与线性空间

什么是线性颜色空间?

如图,横轴为输入给显卡进行渲染的的颜色,纵轴为显卡渲染后输出到显示器的颜色结果

所有线性空间就是输入等于输出的 ColorOut=ColorIn^{1} 

输入的颜色不进行任何处理 Gamma值为1

但现实世界要做到输入颜色等于输出颜色是很难的

因为显示器的颜色输出不是线性的,不同显示器输出的也是不同的

人眼对光强的感知能力并不是线性的——对暗部颜色变化更敏感,但很难识别亮部的颜色差异。

 RGB=0.5的灰色,但其物理亮度(光子数)却只有纯白(RGB=1)的22%。

这时为什么呢?为何不是线性的呢?

人们之所以不设定RGB值与亮度值线性相关,是因为人眼更善于发现暗部中亮度的细微差别。

人眼对光强的感知能力并不是线性的——对暗部颜色变化更敏感,但很难识别亮部的颜色差异。

 

在某些阴暗的环境下,点亮一盏灯,这时人眼就会觉得非常亮。如果同时点亮1000盏灯,反而觉得只是10倍的亮度,对亮度的认知相当于从0~1再从1~10.

 因为人眼不易识别亮部的颜色差异,这就导致了在亮部,我们不需要那么多的空间去存储亮度值,因为人眼根本就难以区别它们,如果按照线性存储,就会导致亮部空间的浪费。

所以在电子图象存储技术中,人们降低亮部的采样数来节约磁盘空间——或者说,在不增加数据量的前提下,分配更多的采样数给暗部以提高可辨识精度。

相机捕获到现实世界真实的光的信息,经过处理后显示到屏幕上,我们希望物理世界中的真实值能够于显示器中的呈现值相同,那么怎么做呢?

先来看一下这个做法的演变过程

从最简单的模型演变

(1)图片真实值0.2->(亮部浪费)图片存储值0.2->提交值0.2->(pow 2.2)呈现值0.029 (缺点:浪费存储空间、早期计算机无法直接让呈现值等同于提交值)

(这个2.2是历史问题,但后来对我们是有益的,所有就沿用下来并未修复)

改善以上问题:

(2)图片真实值0.2->(pow 0.45)图片存储值0.48->提交值0.48->(pow 2.2)呈现值0.2

游戏业界带来新的问题:

(3)图片真实值0.2->(pow 0.45)图片存储值0.48->光照计算0.48*2->提交值0.96->(pow 2.2)呈现值0.914(严重偏离真实值0.2*2=0.4)

二、伽马矫正

最后我们的具体做法是:相机捕获到现实世界真实的光的信息,然后对这些数据开n次方根(n即gamma值,一般取1.8~2.2),Output=Input^{\frac{1}{gamma}},然后通过采样存储图像。这样存储的图像就是经过Gamma校正的图像。

线性的光信号变成了非线性的电信号。

而在显示器上显示图片时,则需要做一次逆Gamma校正:Output=Input^{gamma}

将非线性的电信号转换成线性的光信号。

总结一下就是: 

想要游戏的效果接近真实世界,那么就需要保证在光照计算之前处于线性空间!

sRGB=Gamma^{\frac{1}{2.2}} = Gamma矫正=Gamma 0.45    提亮

Gamma 2.2 = Gamma 空间

Gamma 1 = 线性空间

Color * Gamma 1/2.2 * Gamma 2.2 = Color * Gamma 1 = Color

假如摄像机不做Gamma矫正,会是什么情况?

三、sRGB

unity在贴图的导入设置面板中有“sRGB(Color Texture)”选项,勾选它,告诉Unity这是一张sRGB贴图,需要对它做sRGB解码才可以获得用于光照计算的数据;不勾选,即表示这是一张线性贴图,这张贴图的RGB数据可直接用于光照计算。

sRGB是一种颜色空间,它的定义包括White Point、Primaries、OETF、EOTF

Color SpaceWhite PointPrimariesOETFEOTF
sRGBD65R(0.640,0.330),
G(0.300,0.600),
B(0.150,0.060)
δ=12.92,
β=0.0031308,
α=1.055,
γ=12/5
2.2
Rec.709同 sRGB同 sRGBδ=4.5,
β=0.004,
α=1.099,
γ=20/9
~2.4

sRGB标准和Rec.709标准所定义的白点、三元色相同,只是传递函数的定义不同;

下图的马蹄形区域表示人眼能够感知到的最大色域,三角形围起来的区域即 sRGB / Rec.709 的色域:

 

1.色域: sRGB首先设定了RGB三个基色的坐标

2.白点: sRGB也规定了白点位置

3.gamma: sRGB的gamma设定为≈2.2也就是说从外而向内切,先切的很细,然后逐渐变粗

sRGB的编码伽马值实际是12/5=1/2.4,但我们常听说的是1/2.2,这是因为完整版本的伽马函数【1.055*x ^(1/2.4)-0.055】在形状上更接近【x ^(1/2.2)】,如下图的黑线更接近红线,而不是绿线,红线【x ^(1/2.2)】就被大家当做是简化版本的伽马矫正啦:

渲染时的图片来源,不论是照片还是DCC软件,还是手绘和渲染,都是在sRGB颜色空间下工作的

Substance Painter导出贴图时,会对提供色彩信息的贴图(比如Albedo和Specular Color)做sRGB编码(目的是为了让贴图看起来更舒服,匹配人眼感知,同时优化数据存储),所以我们应把它们当作sRGB贴图来使用;而对法线贴图/金属度贴图这类用以存储数值信息的贴图,是不做sRGB编码的,所以我们应把它们当作线性贴图来使用。

对sRGB编码的图片是直接使用还是转换使用?

线性空间:直接用(系统替我们转换)

Gamma空间:手动转换

四、Unity线性空间流程图

 关于 Gamma 与线性的混淆

色彩空间为什么那么空?色度系统、色度图、色域、伽马、白点...  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发容器(二):Concurrent类下的ConcurrentHashMap源码级解析

并发容器-ConcurrentHashMap 前言数据结构JDK1.7版本HashEntrySegment 初始化 重要方法Put方法扩容rehash方法 前言 之前我们在集合篇里聊完了HashMap和HashTable,我们又学习了并发编程的基本内容,现在我们来聊一聊Concurrent类下的重要容器&#xff0c…

程序设计实践--字符串

字符串 回文串 “回文”是指正读反读都能一样的句子,它是古今中外都有的一种修辞方式和文字游戏。你的任务是从键盘输入一个字符串(最大长度<100),判断这个字符串是不是回文,如果是回文,则输出“Yes”, 如果不是, 则输出“No”。 输入描述 输入若干个字符串(最大长…

[C++]使用yolov10的onnx模型结合onnxruntime和bytetrack实现目标追踪

【官方框架地址】 yolov10yolov10框架&#xff1a;https://github.com/THU-MIG/yolov10 bytetrack框架&#xff1a;https://github.com/ifzhang/ByteTrack 【算法介绍】 Yolov10与ByTetrack&#xff1a;目标追踪的强大组合 Yolov10和ByTetrack是两种在目标追踪领域具有显…

【计算机组成原理】指令系统考研真题详解之拓展操作码!

计算机组成原理&#xff1a;指令系统概述与深入解析 1. 指令系统概述 计算机软硬件界面的概念 在计算机组成原理中&#xff0c;指令系统扮演着至关重要的角色&#xff0c;它是计算机软硬件界面的核心。软件通过指令与硬件进行通信&#xff0c;硬件根据指令执行相应的操作。指…

韩顺平0基础学java——第24天

p484-508 System类 常见方法 System.arrycopy&#xff08;src&#xff0c;0&#xff0c;dest&#xff0c;1,2&#xff09;&#xff1b; 表示从scr的第0个位置拷贝2个&#xff0c;放到目标数组索引为1的地方。 BigInteger和BigDecimal类 保存大整数和高精度浮点数 BigInte…

Unity的三种Update方法

1、FixedUpdate 物理作用——处理物理引擎相关的计算和刚体的移动 (1) 调用时机&#xff1a;在固定的时间间隔内&#xff0c;而不是每一帧被调用 (2) 作用&#xff1a;用于处理物理引擎的计算&#xff0c;例如刚体的移动和碰撞检测 (3) 特点&#xff1a;能更准确地处理物理…

RIP路由附加度量值(华为)

#交换设备 RIP路由附加度量值 RIP&#xff08;Routing Information Protocol&#xff09;路由协议中的附加度量值是指在RIP路由原来度量值的基础上所增加的额外度量值&#xff0c;通常以跳数来表示。这个附加度量值可以是正值&#xff0c;也可以是负值&#xff0c;用于影响路…

嵌入式学习记录6.14(练习)

#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(1028,783); //设置左侧背景QLabel *lab1new QLabel(this);lab1->…

慈善组织管理系统设计

一、用户角色与权限 慈善组织管理系统设计首先需要考虑的是用户角色与权限的划分。系统应明确区分不同的用户角色&#xff0c;如管理员、项目负责人、财务人员、捐赠者等&#xff0c;并为每个角色分配相应的权限。管理员应拥有最高的权限&#xff0c;能够管理系统全局&#xf…

集成学习方法:Bagging与Boosting的应用与优势

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

嵌入式数据库的一般架构

嵌入式数据库的架构与应用对象紧密相关&#xff0c;其架构是以内存、文件和网络等三种方式为主。 1.基于内存的数据库系统 基于内存的数据库系统中比较典型的产品是每个McObject公司的eXtremeDB嵌入式数据库&#xff0c;2013年3月推出5.0版&#xff0c;它采用内存数据结构&…

redis 缓存jwt令牌设置更新时间 BUG修复

大家好&#xff0c;今天我又又又来了&#xff0c;hhhhh。 上文中 我们永redis缓存了token 但是我们发现了 一个bug &#xff0c;redis中缓存的token 是单用户才能实现的。 就是 我 redis中存储的键 名 为token 值 是jwt令牌 &#xff0c;但是如果 用户a 登录 之后 创建一个…

动态规划日常刷题

力扣70.爬楼梯 class Solution {public int climbStairs(int n) {return dfs(n);}//递归 //注意每次你可以爬 1 或 2 个台阶//如果最后一步是1 就先爬到n-1 把它缩小成0-n-1的范围//如果最后一步是2 就先爬到n-2 把它缩小成0-n-2的范围 private int dfs(int i){if(i < 1){r…

EarMaster 7.2. 54中文永久下载和安装激活使用指南

视唱练耳是每一个音乐艺考生都需要掌握的基础技能&#xff0c;要求学生通过学习掌握对音程、和弦以及单音的听辨能力。不过学习的过程不是一蹴而就的&#xff0c;除了需要大量的时间以外&#xff0c;还需要一些视唱练耳软件辅助学习。今天给大家介绍&#xff0c;能听辨音程的软…

EasyRecovery2024手机数据恢复的神器,你值得拥有!

EasyRecovery是一款超级实用的数据恢复软件&#xff0c;它能够帮助你找回不小心删除、格式化或丢失的数据。无论是照片、音乐、视频&#xff0c;还是重要的工作文件&#xff0c;EasyRecovery都能帮助你轻松找回。 而且&#xff0c;EasyRecovery的操作非常简单&#xff0c;即使…

OpenCV中 haarcascades 级联分类器各种模型.xml文件介绍

haarcascades Haar Cascades 是一种用于对象检测的机器学习模型&#xff0c;特别是在OpenCV库中广泛使用。这些模型通过训练大量的正样本&#xff08;包含目标对象的图像&#xff09;和负样本&#xff08;不包含目标对象的图像&#xff09;来识别图像中的对象。Haar Cascades …

索引失效有效的11种情况

1全职匹配我最爱 是指 where 条件里 都是 &#xff0c;不是范围&#xff08;比如&#xff1e;,&#xff1c;&#xff09;&#xff0c;不是 不等于&#xff0c;不是 is not null&#xff0c;然后 这几个字段 建立了联合索引 &#xff0c;而且符合最左原则。 那么就要比 只建…

如何让视频有高级感 高级感视频制作方法 高级感视频怎么剪 会声会影视频剪辑制作教程 会声会影中文免费下载

高质量视频通常具有清晰的画面、优质的音频和令人印象深刻的视觉效果。这篇文章来了解如何让视频有高级感&#xff0c;高级感视频制作方法。 一、如何让视频有高级感 要让视频有高级感&#xff0c;要注意以下几个要点&#xff1a; 1、剧本和故事性&#xff1a;一个好的剧本和…

ATMEGA16读写24C256

代码&#xff1a; #include <mega16.h> #include <stdio.h> #include <i2c.h> #include <delay.h> // Declare your global variables here #define EEPROM_BUS_ADDRESS 0xa0 #asm.equ __i2c_port0x15.equ __sda_bit1 .equ __scl_bit0 #endasm uns…

C语言程序设计-6 循环控制

C语言程序设计-6 循环控制 循环结构是程序中一种很重要的结构。其特点是&#xff0c;在给定条件成立时&#xff0c;反复执行某程序 段&#xff0c;直到条件不成立为止。给定的条件称为循环条件&#xff0c;反复执行的程序段称为循环体。&#xff23;语 言提供了多种循环语句&a…