Gamma矫正,先有鸡还是先有蛋的故事

article/2025/11/10 15:17:30

先上图

 

此图出于LearnOpenGl CN。原文可能由于翻译的关系,导致内容其实并不好理解。翻阅了不少资料后(其实就是冯乐乐老师的入门精要,逃...),想对gamma矫正做一个简单的总结。

先剖析一下这张图的含义(此图其实不是重点)。首先,横轴代表,给计算机提供的颜色的物理强度rgb(图片上储存的信息或是shader的输出),纵轴是计算机实际会为这个值提供多少物理强度

中间直的小点虚线代表,你给计算机提供多少,计算机就用多少(实际不会这样)。

下弯的线表示,计算机会使用更低的数字替代你的输入(这是计算机实际的工作方式),在crt时代,这个偏低是利用显示屏硬件上的缺陷自动进行的,而现在这个偏低是故意的。

故意的原因在于数码摄像器材的8位每单位输出为了保存更多的暗部信息,会对实际捕获到的物理强度进行上弯encoding后再保存,以使得256个梯度中有更多的梯度用于表示暗部的细节,计算机在显示照片时为了平衡这个上弯的动作,就需要有一个下弯的decoding。

也就是说,你给计算机提供的颜色值,显示屏在显示前会无脑的下弯。不论你显示的是一张真实拍摄的图片还是在显示屏上制作的图片,又或者是,给他提供的基于物理模拟的渲染结果。 

真实的图片由于这套机制就是给他量身定做的,下弯后,正常。显示屏上制作的图片由于输出输入在相同的下弯空间内,所以也正常(如果硬要扣的话,可以想象如下情景。你想要一个实际0.2的红,但其实计算机告诉你他是0.5的,而实际显示出来的时候,计算机又tm把他当作0.2处理...计算机在私底下欺骗了你两次,圆掉了这个谎言)。而当你把物理模拟的结果直接给计算机用于显示的时候,结果就是错误的了(下弯了)。

所以基于物理的渲染器会像摄像机器材做的那样上弯自己的输出,以平衡马上会受到的下弯。同时,这其实也是对自己输出的一个保护,因为帧缓冲一般也是8位的。(可以把渲染想象成拍照..渲染结果同样要保存到一张图片(帧缓冲)中),直接把渲染结果往里塞,同样会失去很多暗部的细节。当然如果开启hdr模式,帧缓冲的精度会扩大,暗部细节可以随意保留,但最后为了平衡显示器下弯,还是需要做一次上弯。

渲染器的输出是正常了,输入呢?

由于我们知道贴图素材其实被上弯过的(不论是被摄像器材还是被计算机欺骗了的隐式上弯(0.2的红被你当成0.5的)),所以在基于物理模拟时,采样这些贴图前就需要提前进行下弯,让他们持有正确的物理信息。unity中的lieanr/gamma设置就是设置上述内容的。当选用linear设置并且采样sRGB的贴图时,会使用下弯操作(贴图也可以不设置sRGB来拒绝被下弯,但是你得保证你的贴图数据真的不需要下弯,比如它是一张高精度的线性颜色空间的图片,又或者是一张法线贴图,法线贴图是你眼睛调出来的吗,笑....),输出渲染结果时,会上弯,随后显示屏下弯。你就能看到正确的物理效果。

那为什么需要设置呢,无脑linear不就好了吗。因为自动对输出进行gamma矫正是硬件行为,且在大多数移动端设备都不支持...所以,移动端上,其实可以自己手动实现一个linear的操作。不嫌麻烦的话,可以在每个fs输出的时候,进行上弯操作(贴图方面,并不确定是不是都支持SRGB的纹理格式,不支持的话就需要手动下弯),但不推荐之后再进行alpha混合(用上弯后的颜色混合会导致错误的物理结果)。比较简便的方法是使用后处理,把渲染结果输出到一个高精度的texture上再做色调映射+上弯(如果仍然是8位的话,还是需要先上弯保护暗部细节,等于还是要在fs里写,所以需要高精度的RTT),显然这就对性能有消耗(前一种方法累,但是省了一定的性能,同时透明变得很尴尬,后一种方法简便直观,除了高精度RTT的消耗其他没有副作用,而且很多情况下都需要高精度RTT,所以也可以认为没有额外消耗)


http://chatgpt.dhexx.cn/article/ulHQusIB.shtml

相关文章

记录参加CSDN上海大联欢活动

CSDN官方北上广三地同时举行的活动小结:http://geek.csdn.net/news/detail/50482,下面是本人参加上海站的小结。 今天很荣幸参加CSDN技术大牛上海聚会,首先申明一点我只是一个不起眼的小程序员,首先就是要感谢CSDN给我这么一个机…

Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

转自冯乐乐的《Unity Shader入门精要》 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象。 首先,光线从光源中被发射出来。 然后,光线和场景中的一些物体相交:一些光线被物体吸收了&#xff…

shader基础学习摘要(一)

开篇致谢: 感谢冯乐乐老师的shader入门精要。 // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)Shader "Unity Shaders Book/Chapter 5/Simple Shader" {Properties{_Color("Color Tint", Color) (1, 1, 1, …

对谈 | “计算机学神”闫令琪:我不希望别人说Rendering已经没东西可解了

我还要继续学习图形学吗? 是继续在学术界钻研,还是进入工业界? 元宇宙的到来,就是图形学的春天了吗? 以上,是我们常在后台收到的问题。于是,2022年8月,GAMES104课程组邀请了王希、…

Unity 之 Scriptable Objects 更直观的序列化

在日常开发中总会在Inspector面板中填写一些序列化信息,如:名称、血量、或者秘钥序列号等(图一)。但看似方便,还是有些缺点的,例如填写的序列化信息不能共享,如果在prefab上对应的脚本丢失&…

Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

转自 冯乐乐的《Unity Shader 入门精要》 2010年的Unity 3 中,Surface Shader 出现了。 表面着色器的一个例子。 我们先做如下准备工作。 1)新建一个场景,去掉天空盒子 2)新建一个材质,新建一个Shader&#xff0c…

从图形渲染管线谈游戏性能优化

从图形渲染管线谈性能优化 最近做一个3D场景类项目,其中涉及到各种建筑模型、植物模型、地形等等。画面效果还不错;可是运行起来,那性能啊,没得玩。索性尝试了各种优化手段,这里简单和大家分享一下。当然,在…

《Unity Shader入门精要》笔记01 前言

《Unity Shader入门精要》笔记01 前言 ——本系列是基于人民邮电出版社《Unity Shader入门精要》(冯乐乐著 )的自学Unity Shader笔记,如果您发现了本文的纰漏,还望不吝指正。 写在前边 本书旨在从基础开始,帮助读者逐…

unity学习-shader(一)

渲染流水线 1 CPU流水线2 GPU流水线2.1 顶点着色器2.2 剪裁2.3 屏幕映射2.4 三角形设置2.5 三角形遍历2.6 片元着色器2.7 逐片元操作 应用阶段 需要准备好场景数据,比如摄像机、模型、光源等。需要再这里做粗粒度剔除(culling)工作&#xff0…

Unity Shader入门精要--第4 章 学习Shader 所需的数学基础:矩阵

Unity系列文章目录 文章目录 Unity系列文章目录前言4.4.3 矩阵运算4.4.4 特殊的矩阵2.单位矩阵 参考 前言 不幸的是,没有人能告诉你母体(matrix)究竟是什么。你需要自己去发现它。 —电影《黑客帝国》(英文名&#xf…

【转】《Unity Shader入门精要》冯乐乐著 书中彩图

为方便个人手机学习时候查阅,从网上转来这些彩图。 如属过当行为,联系本人删除。 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_corrigenda.html 转自:http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_image…

【转】《Unity Shader入门精要》冯乐乐 随书彩图

绕了好多圈子终于还是沉下心来好好看这本书了… 以下是原项目GitHub中分享的随书彩图 学习的时候看到色彩丰富的东西会心情更好咯 原项目GitHub链接 前言 第2章 渲染流水线 图2.1 真实生活中的流水线 图2.2 渲染流水线中的三个概念阶段 图2.3 渲染所需的数据&#xff08…

《Unity Shader入门精要》冯乐乐著 书中彩图

为方便个人手机学习时候查阅,从网上转来这些彩图,然后整合所有资料。 如属过当行为,联系本人删除。 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_corrigenda.html 前言 第2章 渲染流水线 图2.1 真实生活中的流水线…

冯乐乐之二 shader的数学

冯乐乐目录 第2章渲染流水线介绍 第三章 Unity shader基础 基础shaderLab语言,shader结构,属性properties,主角SubShader,备胎Fallback。 shader三大类型: Unity宠儿表面着色器,聪明boy顶点片元着色器…

各大浏览器清除缓存(cache)详细步骤

1. Firefox 1.1 选择“Options”: 1.2 选择“Advanced”->“Network”->“Cached Web Content”,点击“Clear Now”: 2. Chrome 2.1 选择“Settings”: 2.2 点击页面底部“Show advanced settings”: 2.3 选择…

浏览器如何清除缓存教程

打开浏览器—设置—隐私设置—清除浏览器数据

清除浏览器的缓存

第一种方法 在浏览器界面按F12之后,再选择Network,选中Disable cache, 然后刷新(这里有个玄学的问题就是即使你已经选中了Disable cache, 也需要打开network这个页面再刷新才有效, 亲测有效, 但是我也不知道为什么) 第二种方法 在浏览器界面直接Ctrl Shift R 比较方便,但…

Edge浏览器如何清除缓存

浏览器在使用过程中会产生大量的缓存,Edge浏览器如何清理缓存?下面是Edge浏览器清理缓存的操作步骤。 1.双击Edge图标打开Edge浏览器。 2.单击右Edge浏览器上角的“更多操作”。 3.弹出菜单,选择“设置”。 4.选择单击“选择要清除的内容”…

清除缓存?(浏览器)

清除缓存 清空浏览器历史记录 **浏览器缓存:**浏览器将用户请求过的静态资源,存储到电脑本地磁盘中,当浏览器再次访问时,就可以直接从本地加载,不需要再去服务端请求了。 好处:减少了服务器的负担&#x…