伽玛校正(Gamma Correction)
比较好的伽玛校正文章看这个文章或者是知乎的回答
因为我有时候不太喜欢某些复杂的表述,喜欢按自己理解来记忆。不敢保证理解正确,因此仅供参考
伽玛校正
对颜色值做乘方运算,其中gamma值 == 幂次,比如(0.5,0,0)(0.5,0,0)(0.5,0,0)颜色,应用gamma矫正:(0.5,0,0)2.2=(0.217,0,0)(0.5,0,0)^{2.2}=(0.217,0,0)(0.5,0,0)2.2=(0.217,0,0),gamma = 2.2
我们为什么要做伽马矫正?
- 所有显示器都会自动进行gamma = 2.2的校正,即在你所定义的颜色的基础上 做2.2次幂的乘方运算。
- 比如我在程序中输出颜色
(0.5, 0, 0)
,在显示器上其实是经过显示器矫正后的颜色(0.217, 0, 0)
,偏暗! - 为了消除这种影响,我们要对我们游戏中定义的颜色做gamma = 1/2.2 矫正。我们想要显示器输出的是
(0.5, 0, 0)
,就必须进行伽玛校正,先对颜色做1/2.2的乘方运算,再把颜色给显示器,它会做2.2乘方运算,结果就还是(0.5, 0, 0)
- 过程看下图
一个容易出错的点:
对这句话理解: 显示器输出的颜色是经过gamma2.2矫正后的颜色,现在显示器输出的是(0.5,0,0)
,半红色。艺术家创建纹理的时候,不知道他是0.5R啊,靠感觉为了跟这个颜色一样,他在RGB空间把颜色值调到了(0.729,0,0)
,诶现在感觉两个颜色看起来一模一样了美滋滋,但是这样的后果就是,艺术家定义的这个纹理颜色0.729是在非线性空间的(sRGB空间)。我们在程序中,拿到这个纹理,按照之前所说的 会先进行gamma1/2.2矫正,会得到得到0.866R,然后显示器默认2.2矫正后,显示的颜色是(0.728,0,0)盖了帽了,颜色偏亮!
解决办法:
- 让艺术家们调颜色的时候,调到正确的颜色后,应用2.2gamma矫正后,再把纹理给我们
- 艺术家们不调,我们自己调,对采样到的颜色做2.2矫正,变到线性空间后,再进行后面的操作
vec3 diffuseColor = pow(texture(diffuse, texCoords).rgb, vec3(gamma));
opengl提供的解决方式
为每个sRGB空间的纹理做这件事非常烦人。幸好,OpenGL给我们提供了另一个方案来解决我们的麻烦,这就是GL_SRGB和GL_SRGB_ALPHA内部纹理格式。【这个纹理格式,仅仅是帮我们把传入的纹理图片做一遍2.2gamma矫正而已,没别得东西,因此我们使用这个纹理格式,必须明确知道传入的图片是在sRGB空间定义的,那如果是传入的什么法线纹理、光照高光贴图纹理,诸如此类都是艺术家或我们自己在线性空间定义的,不能使用上述两种格式
】
如果我们在OpenGL中创建了一个纹理,把它指定为以上两种sRGB纹理格式其中之一,OpenGL将自动把颜色校正到线性空间中,这样我们所使用的所有颜色值都是在线性空间中的了。我们可以这样把一个纹理指定为一个sRGB纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
如果你还打算在你的纹理中引入alpha元素,必究必须将纹理的内部格式指定为GL_SRGB_ALPHA。
因为不是所有纹理都是在sRGB空间中的所以当你把纹理指定为sRGB纹理时要格外小心。比如diffuse纹理,这种为物体上色的纹理几乎都是在sRGB空间中的。而为了获取光照参数的纹理,像specular贴图和法线贴图几乎都在线性空间中,所以如果你把它们也配置为sRGB纹理的话,光照就坏掉了。指定sRGB纹理时要当心。
伽玛校正(Gamma Correction)相关推荐
- OpenGL学习脚印:伽马校正(Gamma Correction)
写在前面 由于CRT,LED等显示设备显示颜色时并非按照线性方式工作,因此我们在程序中输出的颜色,最终输出到显示器上时会产生亮度减弱的现象,这种现象在计算光照和实时渲染时对图形质量有一定影响,需要我们 ...
- OpenGL Gamma校正 (Gamma Correction)
OpenGL Gamma校正 Gamma校正简介 Gamma校正 sRGB纹理 Gamma校正简介 当我们计算出场景中所有像素的最终颜色以后,我们就必须把它们显示在监视器上.过去,大多数监视器是阴极射 ...
- 伽马校正(gamma correction)学习笔记
学习HDR和Bloom特效的过程中,接触到了伽马矫正的问题.查阅了不少资料,这一篇讲的最清楚,下面的图片也是来自该文章. 这应该说是一个历史遗留问题,以前的CRT显示器是使用电子显像管,通过控制电流大 ...
- Gamma Correction(伽马校正)
定义 Gamma correction, gamma nonlinearity, gamma encoding, or often simply gamma, is the name of a non ...
- Gamma Correction/Gamma校正/灰度校正/亮度校正(已更正) - 部分 DCC 中的线性工作流配置
文章目录 也可以简单参考 SIGGRAPH 2010 的 PBS 的 Gamma-Correct Unity 中的 gamma.linear 工作流 Unity BRP 管线中的 shaderlab ...
- OpenGL Gamma Correction伽马校正的实例
OpenGL Gamma Correction伽马校正 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> # ...
- 【转】伽马校正(Gamma Correction)
在未得到原作者的同意下转载,特地在此贴出源地址以作声明:http://blog.163.com/hong.lg0518@126/blog/static/18907460200972711556304/ ...
- 我理解的伽马校正(Gamma Correction)
[图形学]我理解的伽马校正(Gamma Correction) 2015年05月30日 18:22:52 妈妈说女孩子要自立自强 阅读数:69844 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- 伽马校正笔记(Gamma Correction)
在数字图像系统中,伽马(Gamma)是一个重要的但很少被正确理解的特性.它定义了一个像素的数值和对应的实际亮度之间的关系. 人眼感知的亮度和相机"看到"的亮度区别 对于数码相机来说 ...
- Gamma Correction
一. 伽马校正简介: 伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正.如果图像原样显示在显示器等上,画面就会显得很暗.伽马校正通过预先增大 RGB 的值来排除影响,达到对图像校正的目 ...
最新文章
- 51nod1236 序列求和 V3
- 本周六与您相约 | 计算未来轻沙龙:让机器拥有理解语言的能力
- oracle 服务管理,管理 Oracle 内容服务类别
- wxWidgets:wxMenuEvent类用法
- 【目录】 Git 教程
- apt-get常用命令及工作原理
- 某简单易懂的人脸识别 API 的开发环境搭建和简易教程
- Linux函数之间的goto 跳转
- 计算机日常英语,计算机英语的常用句子
- Linux 文件类型
- 2017年10月份计算机网络管理,2017年下半年网络管理员考试上午试题及答案
- 多测师肖sir__金牌高级讲师软件测试___疑难杂症之app端口占用
- 2022-2027年中国发动机仪表市场规模现状及投资规划建议报告
- UOJ14 DZY Loves Graph
- 申请CVE的姿势总结
- chrome谷歌浏览器插件制作简易教程
- ps2模拟器bios3dm_呆萌PS2模拟器bios文件下载|呆萌PS2模拟器专业版下载v3.1.2-乐游网安卓下载...
- 基于SSM框架的图书馆借阅管理系统
- DDN获中国工信部—可信区块链评测证书
- 计算机基本操作小技巧
热门文章
- python控制浏览器最小化_如何在selenium webdriver 3中最小化浏览器窗口
- linux 使用ACR122U-A9设备读写M1卡
- 三步教你免费下载省,市,区县行政区Shp数据
- iPhone设备字体详解
- 【Linux 内核 内存管理】内存映射相关数据结构 ② ( vm_area_struct 结构体成员分析 | vm_mm 成员 | vm_page_prot 成员 | vm_flags 成员 )
- JAVA实现MD5算法、SHA1算法和SHA256算法
- matlab仿真的五个步骤,matlab仿真步骤
- Eclipse的安装
- Chrome离线安装包下载方式
- RemObjects Elements多用途软件开发