【Unity3D】伽马校正

article/2025/7/27 18:47:46

1 伽马相关概念

1.1 人眼对亮度变化的感知

        人眼对亮度变化的感知不是线性的,如下图,人眼对亮区的亮度变化不太敏感,对暗区的亮度变化较敏感。另外,我们可以想象一下,在一个黑暗的房间里,由 1 根蜡烛到 2 根蜡烛的变化,我们很容易感知到,但是由 100 根蜡烛到 101 根蜡烛的变化,我们就不容易感知到。因此,对于固定的存储空间,我们应该给暗区分配更多的存储空间,而给亮区少分配些空间,这样能让更多的细节在暗区呈现,而亮区不必呈现太多细节(因为人眼感知不到亮区的细微变化,呈现太多细节只会浪费空间)。

1.2 伽马编码和伽马解码

        1)伽马函数

        伽马函数公式如下,因其指数部分 γ 读音为伽马(gamma)而来。

         当 0 < γ < 1 时,伽马函数的图像从左往右逐渐平缓,通常作为伽马编码处理;当 γ > 1 时,伽马函数的图像从左往右逐渐陡峭,通常作为伽马解码处理。如下是 γ 值为 0.45 和 2.2 的函数图像。

        2)伽马函数在图像捕捉和显示中的应用

        一般情况下,一个像素使用 8 位存储,可以表示 256 种颜色。为了尽可能线性化人眼感知的亮度变化(人眼对暗区的亮度变化更敏感,需要使用更多的存储空间,对亮区的亮度变化不太敏感,可以少分配些空间),对相机采集到的图像进行伽马编码处理后,再存入 jpeg 等格式图片文件中,在读取图片文件时,通过伽马解码处理后再显示,如下图所示。

         在早期,CRT(Cathode Ray Tube,阴极射线管)几乎是唯一的显示设备,它有一个特性,输入电压和显示亮度不是线性关系,而是伽马函数关系,并且其 γ 值刚好是伽马编码函数的 γ 值的倒数,这正好补偿了图像捕捉设备的伽马编码造成的亮度非线性问题。因此,显示设备只需要输入线性变化的电压,就可以还原线性变化的亮度,而不需要进行伽马解码处理。现在 CRT 设备很少见了,并且后来的显示设备有着不同的伽马曲线(γ 值不同),但人们仍在硬件上做了调整来提供兼容性。

        注意:透明通道不参与伽马编码和伽马解码

        3)sRGB 颜色标准

        微软联合爱普生、惠普制定了 sRGB 颜色空间标准,推荐相机的伽马编码函数的 γ 值为 0.45,显示器的伽马解码函数的 γ 值为 2.2(因为 2.2 × 0.45 ≈ 1)。绝大多数的摄像机、PC 和打印机都使用了 sRGB 标准。

1.3 颜色空间

        Unity 中材质渲染的颜色空间分为伽马空间(默认)和线性空间,如下。

        伽马空间中,Unity 不会对 Shader 的输入和输出进行任何处理,因此,输入的像素可能是非线性的,输出的像素经过显示器的伽马解码处理后可能会得到非预期的亮度,通常表现为场景整体变暗。

        线性空间中,Unity 会把输入纹理设置为 sRGB 模式,在该模式下,硬件在对纹理进行采样时会自动进行伽马解码,在 Shader 写入颜色缓冲前自动进行伽马编码(HDR 除外)。

        用户可以在【Edit→Project Settings→Player→Other Settings→Rendering→Color Space】中设置颜色空间,如下。

2 伽马对亮度和混合的影响

        当颜色空间使用默认在伽马空间时,如果不进行伽马矫正,可能会出现场景整体偏暗、混合异常等问题。本节实验完整资源见→Unity3D伽马校正对比实验。

2.1 伽马对亮度的影响

        新建一个场景,调整相机位置和旋转角度分别为 (0, 0, -1.5)、(0, 0, 0),调整直射光旋转角度为 (45, -90, 0),使得直射光从右上角 45° 射向左下角;新建一个 Sphere,调整其位置为 (0, 0, 0),新建一个材质,重命名为 DiffuseMat,设置其 Shader 为【Legacy Shaders / Diffuse】,将该材质拖拽给 Sphere;设置环境光为全黑(在【Window→Rendering→Lighting→Environment→Ambient Color】中设置),使得渲染只受漫反射影响。伽马空间和线性空间中 Sphere 渲染如下。

        由于球体的渲染只受漫反射影响,并且直射光从右上角 45° 射向左下角,因此右边的渲染才更符合要求。另外,左侧图像相比右侧图像,整体偏暗一些。

2.2 伽马对混合的影响

        新建一个场景,创建 3 个 Quad 和 3 个材质,将这些材质分别拖拽到 3 个 Quad 中,将以下 Shader 绑定到这些材质中,将边缘渐变的圆形图片拖拽到 3 个材质中,调整 3 个材质的颜色分别为红、绿、蓝。

        SimpleBlend.shader

Shader "MyShader/SimpleBlend" {Properties {_MainTex ("Main Tex", 2D) = "white" {}_Color ("Color Tint", Color) = (1, 1, 1, 1)}SubShader {Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}Pass {ZWrite OffBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#include "UnityCG.cginc"#pragma vertex vert_img#pragma fragment fragsampler2D _MainTex;fixed4 _Color;fixed4 frag(v2f_img i) : SV_Target {return fixed4(_Color.rgb, tex2D(_MainTex, i.uv).a);}ENDCG}}FallBack "Transparent/VertexLit"
}

        伽马空间和线性空间中 3 个 Quad 的渲染如下。

         左侧图片边缘较硬,右侧图片边缘较柔和,更符合实际情况。

3 伽马校正策略

        在线性空间下,系统自动进行了伽马校正;在伽马空间下,需要用户手动校正。另外,Unity 的线性空间并不是所有平台都支持,如:移动平台就无法使用线性空间。

        对非线性的输入纹理,进行伽马解码校正如下:

float3 tex = pow(tex2D(_Tex, i.uv).rgb, 2.2);

        在片元着色器输出前,进行伽马编码校正如下:

fragColor.rgb = pow(fragColor.rgb, 0.45);
return fragColor;

        注意:当场景中存在半透明物体时,上述校正会导致混合在非线性空间中进行,影响混合效果,一种有效的解决方法是:将伽马编码校正放在屏幕后处理中进行。


http://chatgpt.dhexx.cn/article/864T9aSd.shtml

相关文章

伽马校正(gamma correction)学习笔记

学习HDR和Bloom特效的过程中&#xff0c;接触到了伽马矫正的问题。查阅了不少资料&#xff0c;这一篇讲的最清楚&#xff0c;下面的图片也是来自该文章。 这应该说是一个历史遗留问题&#xff0c;以前的CRT显示器是使用电子显像管&#xff0c;通过控制电流大小来控制显示屏幕上…

sRGB标准与伽马校正 理解

srgb &#xff1a; 颜色值会以非线性的方式存储 如一个颜色值在线性空间中&#xff0c;rgb(1,1,1)&#xff0c; 在gamma空间中&#xff0c;rgb会变为(1的2.2幂次&#xff0c;1的2.2幂次&#xff0c;1的2.2幂次),颜色值会发生改变&#xff0c;这样方便在显示器中显示的时候&am…

伽马校正和颜色空间

一、伽马校正 所谓gamma校正&#xff0c;实际上是一个颜色的非线性变换。下面来解释这个变换曲线存在的原因。 1.1 人眼的非线性视觉效应 为什么要有gamma校正了。一言以蔽之&#xff0c;人眼的生理效应。如下图所示&#xff0c; 第一行是人眼感受到的线性亮度变化&#xf…

伽马校正探究

关于伽马校正的前因后果&#xff0c;在网上有不同版本的说法&#xff0c;由于年代久远的因素&#xff0c;导致原本很简单的事情越说越复杂。今天我们的目标就是抓住伽马的头&#xff0c;而不是摸一下伽马的尾巴。 一&#xff0c;鱼龙混杂的论调 1&#xff0c;CRT 显示器的物理…

图像的伽马校正

图像的伽马校正 图像的伽马校正属于图像增强中幂次增强&#xff0c; γ>1时&#xff0c;使图像变暗&#xff0c;即图像变黑&#xff1b; γ<1时&#xff0c;使图像变亮&#xff0c;即图像变白。 下面是伽马校正的过程&#xff1a; 1&#xff09;将像素值为【0,255】如2…

伽马校正笔记(Gamma Correction)

在数字图像系统中&#xff0c;伽马&#xff08;Gamma&#xff09;是一个重要的但很少被正确理解的特性。它定义了一个像素的数值和对应的实际亮度之间的关系。 人眼感知的亮度和相机“看到”的亮度区别 对于数码相机来说&#xff0c;当检测的光子数增加一倍时&#xff0c;sens…

伽马校正-

伽马校正 问题描述&#xff1a;读取图像&#xff0c;然后对图像进行伽玛校正。 伽马校正 这里是一篇写伽马校正比较好的文章&#xff0c;我觉得可以作为背景知识补充。 伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上&…

图形 2.6 伽马校正

一、Gamma校正 1、颜色空间 图中可以看到&#xff0c;sRGB和Rec.709的色域虚线一样&#xff0c;三原色的位置是相同的&#xff0c;那么它们之间的区别就是&#xff1a;传递函数不同 2.传递函数 定义 知道了颜色的颜色值之后&#xff0c;想要在电子设备上显示&#xff0c;就…

伽马校正(Gamma Correction)与sRGB

文章目录 CRT显示器与人眼视觉非线性显示与渲染伽马校正sRGB 纹理正确的点光衰减补充参考资料 CRT显示器与人眼视觉 过去, 大多数监视器是阴极射线管显示器(CRT). 这些监视器有一个物理特性就是两倍的输入电压产生的不是两倍的亮度. 输入电压产生约为输入电压的 2.2 次幂的亮度…

图形学基础——伽马校正

百人计划学习视频连接&#xff1a;【技术美术百人计划】图形 2.6 伽马校正 颜色空间 具体内容在之前的文章有讲&#xff1a;色彩空间介绍 sRGB&#xff1a;微软在1996年发布的通用颜色标准DCI-P3&#xff1a;数字电影播放的颜色标准Rec-709、PAL&#xff1a;电视行业的颜色标…

伽马校正

注&#xff1a;本文为博主参考书籍和他人文章并加上自己的理解所编&#xff0c;作为学习笔记使用并将其分享出去供大家学习。若涉及到引用您的文章内容请评论区告知&#xff01;如有错误欢迎指正&#xff01; 一、伽马校正简介 射伽马校正是图像预处理阶段经常使用的一个非…

可执行文件的装载,进程和线程,运行时库的入口函数(第六章)

目录 第1步.创建一个独立的虚拟内存空间 第2步.读取可执行文件头&#xff0c;建立虚拟空间和可执行文件之间的映射关系 第3步.将cpu的指令寄存器设置成可执行文件的入口地址&#xff0c;启动运行。 程序开始执行&#xff0c;发生页错误。 随着程序的执行&#xff0c;不停…

疯狂python讲义学习笔记——前十章完结

#第一章&#xff1a;绪论 #单行注释多行注释""" 多行注释 """#dir列出指定类或模块的属性与方法&#xff0c;help查看某个函数或方法的帮助文档 print(dir(str)) print(help(str.title))#第二章&#xff1a;数据类型 a5 print(type(a))#<clas…

嵌入式代码学习心得记录

一、C语言学习心得记录 函数递归 编写顺序 终结条件输入下一级递归参数,调用下一级递归函数.当前递归函数的操作代码,在下一级递归函数执行完成后执行的操作代码. #include <stdio.h> #include <string.h>void revert(char *s, int len) {// 终结条件if(len <…

python 字节流分段_一文掌握CTF中Python全部考点

声明&#xff1a;Tide安全团队原创文章&#xff0c;转载请声明出处&#xff01;文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用&#xff0c;任何人不得将其用于非法用途以及盈利等目的&#xff0c;否则后果自行承担&#xff01; 前 言 一次偶然的机会&#xff0c…

Python课程学习笔记 下

笔记目录 Python 学习笔记 上面向对象和异常面向对象基本理论定义类根据类实例化对象属性相关方法相关类的补充属性补充方法相关补充描述器python对象的生命周期内存管理机制面向对象的三大特性面向对象应当遵循的原则 错误和异常错误和异常的概念常见的系统异常和系统异常类继…

从点击APP图标到首页展示的加载过程

转载链接在这里 iOS 系统架构 Mac系统是基于Unix内核的图形化操作系统&#xff0c;Mac OS 和 iOS 系统架构的对比分析发现&#xff0c;Mac OS和iOS的系统架构层次只有最上面一层不同&#xff0c;Mac是Cocoa框架&#xff0c;而iOS是Cocoa Touch框架&#xff0c;其余的架构层次都…

python os模块

10.3 os模块 os就是“operating system”的缩写&#xff0c;顾名思义&#xff0c;os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页可以极大增强代码的可移植性。如果该模块中…

Python:异常处理,模块和包,正则表达式

1&#xff0c;异常处理机制 Python的异常处理机制可以让程序具有极好的容错性&#xff0c;让程序更加健壮。当程序运行出现意外情况时&#xff0c;系统会自动生成一个Error对象来通知程序&#xff0c;从而实现将“业务实现代码”和“错误处理代码”分离&#xff0c;提供更好的可…

操作系统面试题总结

进程的常见状态&#xff1f;以及各种状态之间的转换条件? 创建状态&#xff1a;进程在创建时需要申请一个空白PCB&#xff0c;向其中填写控制和管理进程的信息&#xff0c;完成资源分配。如果创建工作无法完成&#xff0c;比如资源无法满足&#xff0c;就无法被调度运行&#…