伽马校正和颜色空间

伽马校正和颜色空间一、伽马校正所谓gamma校正,实际上是一个颜色的非线性曲线变换。下面来解释这个曲线存在的原因。1.1人眼的非线性视觉效应为什么要有gamma校正了。一言以蔽之,人眼的生理效应。如下图所示,第一行是人眼感受到的线性亮度变化,第二行是真实的非线性亮度变化。可以得出结论,首尾两端是一致的,但是中间值变化不一致;真实的中间亮度值必须更大,才能得到人眼感知的线性亮度变化。我们的目的是让人眼感受到线性的亮度变化曲线,因此输入亮度必须是第二行这种非线性的亮度变化曲线。第二行的亮度变化曲线,就是伽马校正曲线

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、伽马校正

所谓gamma校正,实际上是一个颜色的非线性变换。下面来解释这个变换曲线存在的原因。

1.1 人眼的非线性视觉效应

为什么要有gamma校正了。一言以蔽之,人眼的生理效应。如下图所示,
伽马校正和颜色空间
第一行是人眼感受到的线性亮度变化,第二行是真实的非线性亮度变化。可以得出结论,首尾两端是一致的,但是中间值变化不一致;真实的中间亮度值必须更大,才能得到人眼感知的线性亮度变化。我们的目的是让人眼感受到线性的亮度变化曲线,因此输入亮度必须是第二行这种非线性的亮度变化曲线。
第二行的亮度变化曲线,就是伽马校正曲线

1.2 非线性显示器

显示器为了应对人眼的这种非线性视觉效应,采用的也是类似的机制(也可能是历史原因,总之认为当今的显示器都是如此设计就行)。假设我们输入的颜色值,即输入给显示器的电压,那么这个电压对应的是1.1的第二行(Gamma校正曲线);人眼感受到的显示器的真实输出对应的是1.1的第一行(线性颜色输出),即gamma编码曲线。
如下图所示,
gamma_correction_gamma_curves

这里反复强调了,人眼感受到的显示器亮度,而不是显示器的输出亮度。举个例子,输入颜色值是0.732的话,那么显示器经过gamma编码后输出的亮度是0.5,人眼感受到的亮度是0.218,刚好和人眼的视觉效应匹配。

值得强调的是,gamma指数2.2是可以变化的,在不同的场景下,可以选择不同的gamma指数。

1.3 总结

总结,照片是按照gamma校正曲线编码的,显示器经过gamma编码后,输出照片的亮度是线性曲线,人眼看到线性曲线的亮度后感知到的曲线是gamma曲线。
因此,我们需要确定输入的颜色数据是在线性曲线或者gamma校正曲线上。

二、颜色空间和工作流

颜色空间可以理解为,颜色是在哪个空间下制作的。不需要特别多的数学曲线来描绘,但是这个说明又需要一点美术经验来理解。下面来具体分类解释。

2.1 伽马颜色空间和工作流

比如,我们拍摄的照片,人眼看起来是正确的,那么说明人眼感受到的是线性变化的,因此照片的数据是经过伽马校正的,也就是照片的数据变化是在gamma校正曲线上的。同样的,在电脑上使用软件制作的图片也是处于gamma校正曲线上的。
我们把这种颜色数据在gamma校正曲线上的,叫做gamma color space,也叫做sRGB。
那么,伽马工作流指的是所有的流程都在伽马颜色空间完成,比如输入数据,比如光照计算等。

2.2 线性颜色空间和工作流

类似的,线性颜色空间指的是输入数据是在线性曲线上的。那么,我们如果用一张真实的图片作为输入,首先要对其进行gamma校正,也就是需要将这张贴图设置为sRGB,引擎或者图形接口自动会将其转换。
线性工作流指的是所有的流程都在线性颜色空间完成,比如输入数据,比如光照计算等。
值得强调的是,我们现在的显示器都是gamma显示器,因此我们不能在渲染管线中不能直接输出线性数据,需要转换到sRGB空间再进行输出,某些硬件支持这个自动转换,如果检测到硬件不支持,渲染引擎会在后处理流程中用shader来转换。

2.3 工作流总结

下面用一张流程图来总结颜色空间的工作流,如下所示,
颜色空间工作流

  • sRGB Texture在gamma工作流下正常显示
  • 线性工作流的输出必须进行gamma校正,否则显示会变暗
  • gamma工作流的shader计算在sRGB空间中
  • 线性工作流的shader计算在线性空间中

注意,sRGB贴图移除gamma校正和shader输出进行gamma校正,都有硬件的自动支持,比如OpenGL的sRGB纹理和 GL_FRAMEBUFFER_SRGB。如果硬件不支持,那么应用(比如游戏引擎),在线性工作流中需要自己进行变换,比如加载sRGB贴图时候手动变换到线性空间和使用shader进行gamma校正。

2.4 关于贴图设置为sRGB后变暗的说明

业界或者网上一直流传,贴图设置为sRGB后会变暗。
参考2.3的图,在线性工作流下,如果贴图设置为sRGB后,引擎会对贴图进行去gamma校正,变换为线性空间,颜色数值都会变小,参考1.2的曲线图。不管原始图片是否是sRGB空间下创建的,渲染时候得到的颜色值都变小了,因此不管输出时候是否进行gamma校正,我们看到的结果都会变暗。
如果是gamma工作流,则不会变暗,因为没有去gamma校正这个过程。

三、总结

我们讲述了人眼和显示器的视觉效应,以及两种颜色空间和对应的工作流。我们需要着重弄清楚的是,人眼的视觉效应、显示器的gamma校正、gamma颜色空间(sRGB)。

四、参考资料

Unity Color space
Gamma Correction
Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189862.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python代码自检工具 flake8简单介绍

    python代码自检工具 flake8简单介绍PEP8是Python代码风格规范,它规定了类似行长度、缩进、多行表达式、变量命名约定等内容。尽管你的团队自身可能也会有稍微不同于PEP8的代码风格规范,但任何代码风格规范的目标都是在代码库中强制实施一致的标准,使代码的可读性更强、更易于维护。下面三个库就可以用来帮助你美化代码。Flake8是“将PEP8、Pyflakes(类似Pylint)、McCabe(代码复杂性检查器)和第三方插件整合到一起,以检查Python代码风格和质量的一个Python工具”。执行pip3in

    2025年8月30日
    7
  • c++实现strstr函数_C语言字符串数组

    c++实现strstr函数_C语言字符串数组自己实现C语言中的strstr函数,采用字符一个一个进行匹配,如果不等,则从下一个位置进行匹配。/*strstr实现*/char*mystrstr(constchar*dest,constchar*src){char*tdest=dest;char*tsrc=src;while(*tdest){char*flag=tdest;//设置标志位,方便回滚。while…

    2022年10月13日
    4
  • docker(2)CentOS 7安装docker环境「建议收藏」

    docker(2)CentOS 7安装docker环境「建议收藏」前言前面一篇学了mac安装docker,这篇来学习在linux上安装docker环境准备Docker支持以下的CentOS版本,目前,CentOS仅发行版本中的内核支持Docker。Doc

    2022年7月28日
    7
  • 数据库分区表[通俗易懂]

    数据库分区表[通俗易懂]数据库分区表(一)什么情况下需要分区,准备需要分区的数据   什么数据库需要进行分区?首先看一下我们的案例:2010年6月我们六期IT开发团队接到一个XX全国连锁店的餐饮系统,经过一周的敏捷开发之后,XX餐饮系统正式上线了,由于该软件的功能强大,操作简单,功能灵活等特性,很快在全国各地铺展开来。XX餐饮店的美食也颇受顾客的喜爱,有的店每天的收入高达1W元人民币,每天这么多的收入,那么每天要

    2022年5月3日
    43
  • jvm优化(二)JVM 内存大小设置

    jvm优化(二)JVM 内存大小设置Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对JavaJVM有关内存方面的知识进行详细介绍。一、JavaJVM内存介绍JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟

    2022年6月5日
    90
  • 软件测试外包公司有哪些_工程资料外包的坏处

    软件测试外包公司有哪些_工程资料外包的坏处一、前言:什么是软件测试外包随着最近10年创业风气的发起,已经涌起创业项目外包公司的兴起,已经不仅仅局限为了降低成本,更多的是为了解决自己雇佣技术人员或者无法管理技术人员的难题。那么外包是什么意思呢?似乎大家对外包都闻之色变!这里我们详细的认识一下什么是外包?外包类似中介派遣公司或者叫做劳务输出公司。就是我们公司把你招聘进来,但是又把你派到其他公司(甲方)工作。但是最终你的劳务合同…

    2025年7月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号