Unity Gamma空间和Linear空间转换代码
Gamma与Linear转换
- Cg版本
- 个人理解
- Gamma空间
- 当初的疑惑
- 线性空间
- 结束语
Cg版本
引自: UnityCG.cginc
//--Gamma到Linear转换
inline half3 GammaToLinearSpace (half3 sRGB)
{// Approximate version from http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1return sRGB * (sRGB * (sRGB * 0.305306011h + 0.682171111h) + 0.012522878h);// Precise version, useful for debugging.//return half3(GammaToLinearSpaceExact(sRGB.r), GammaToLinearSpaceExact(sRGB.g), GammaToLinearSpaceExact(sRGB.b));
}
//--精确转换
inline float GammaToLinearSpaceExact (float value)
{if (value <= 0.04045F)return value / 12.92F;else if (value < 1.0F)return pow((value + 0.055F)/1.055F, 2.4F);elsereturn pow(value, 2.2F);
}
//--Linear到Gamma的转换
inline half3 LinearToGammaSpace (half3 linRGB)
{linRGB = max(linRGB, half3(0.h, 0.h, 0.h));// An almost-perfect approximation from http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1return max(1.055h * pow(linRGB, 0.416666667h) - 0.055h, 0.h);// Exact version, useful for debugging.//return half3(LinearToGammaSpaceExact(linRGB.r), LinearToGammaSpaceExact(linRGB.g), LinearToGammaSpaceExact(linRGB.b));
}--精确转换
inline float LinearToGammaSpaceExact (float value)
{if (value <= 0.0F)return 0.0F;else if (value <= 0.0031308F)return 12.92F * value;else if (value < 1.0F)return 1.055F * pow(value, 0.4166667F) - 0.055F;elsereturn pow(value, 0.45454545F);
}
个人理解
Gamma空间
什么是Gamma空间?为什么有Gamma空间?自古江湖上就有定论,刚开始我也是云里雾里,总觉得他们说的有问题。我们先看结果
OK~~没错,上图就是Unity的处理流程。没说的,需要注意的就是如果是线性空间,有的项目贴图的某个通道可能会作为数据图,注意如果是RGB通道的话,数据获取是有错误的,我们可以选择使用取消掉贴图导入是的SRGB选项。或者对数据再次进行Gamma1/2.2的矫正。
当初的疑惑
之前一直就有疑问,先做Gamma1/2.2的贴图压缩,显示器在做Gamma2.2的矫正,这不就是原始数据么?如下曲线图所示,假设一个0.5的数据贴图压缩成0.72974,显示器矫正后成0.5,这不是多此一举么?直接0.5他不香么?
带着疑问去寻找解决问题的答案:
1.图像编码gamma的目的是为了解决低容宽时,图像保存的信息过少的问题。
问:怎么解决呢?
答:人眼对暗色比较敏感,对亮色不敏感。比如白天亮个灯没啥感觉(相对于不亮来说亮度是有增加的),晚上一个萤火虫都存在感比较强。
问:然后呢?
答:根据人眼的规律,我们可以在有限的存储空间中,记录更多的暗的数据,去掉一些亮的数据,这样操作来尽量保持和原来的效果看上去是相似的, 上面的贴图压缩曲线就是把本来暗的区域提亮了。
问:能看出来啊~提亮后,显示器显示时不就又把提升的数据,变回去了么?有啥用?
答:WTF!原来你的点在这。假设我们显得贴图只能存储0,0.2,0.4,0.6,0.8,1这三种数据,毕竟贴图的存储数据是有限的:
实际数据 | 0 | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|
贴图编码后 | 0 | 0.35 | 0.48 | 0.58 | 0.66 | 0.73 | 0.79 | 0.85 | 0.90 | 0.95 | 1 |
存储数据 | 0 | 0.4 | 0.4 | 0.6 | 0.6 | 0.8 | 0.8 | 0.8 | 1 | 1 | 1 |
显示器显示 | 0 | 0.13 | 0.13 | 0.32 | 0.32 | 0.61 | 0.61 | 0.61 | 1 | 1 | 1 |
上面可以看出,真实数据通过贴图的这个中间者传递信息给显示器,而贴图本身能力有限,能存的数据就那么几种,所以他需要存储的时候多存一些暗部的信息,丢弃一些亮部的信息,以保证是个人(注意必须是个人,猫啊狗的就不一样了)看上去感觉还比较逼真。
2.显示器无法线性显示。一般CRT显示器的亮度响应曲线,可以看到其输入电压提高一倍,亮度输出并不是提高一倍,是非线性的。比如红色的亮度为50%,如果一个未经过Gamma矫正的CRT显示器的Gamma值是2.2,那么输出结果的亮度将分别为22%.
问:以前的CRT显示器,由于自身原因才出现的这种情况?还是人们故意做的。
答:确实是硬件的问题。
问:显示的这个变化和上面人类的视觉刺激是巧合还是?
答:Z,这谁知道。。
线性空间
线性空间还比较简单,主要就是为啥Es3.0才支持线性空间,其实还是硬件问题,线性空间下unity会自动开启framebuffer_sRGB。其实主要的还是处理Gamma到Linear的转换问题。
结束语
终于最近又迎来的有时间写东西的时候了~疫情期间,希望大家注意防护!
Unity Gamma空间和Linear空间转换代码相关推荐
- Unity Gamma Linear Color Space
转载文章,出自http://www.manew.com/thread-105872-1-1.html,作者 alphatt Gamma & Linear Color Space 一.真实?感觉 ...
- URP下Alpha从Gamma空间到Linner空间转换(一)——Alpha贴图不叠加
文章目录 问题描述 解决办法: 添加GammaToLinearSpace转换,添加三句 完整Shader: 问题描述 中间是默认的UI贴图,因为unity勾选SRBG,不处理Alpha通道,所以可能出 ...
- Unity的gamma矫正、颜色空间及其转换的问题
Unity的gamma矫正.颜色空间及其转换的问题 1,伽马矫正 2,unity的颜色空间 2.1两种颜色空间流程 2.2pbr贴图格式 2.3手动完成空间切换 2.4升级URP后亮度不一致问题的问题 ...
- Unity内置管线升级URP之色彩空间(伽马、sRGB、Gamma Space和Linear Space)
目录 本文内容 伽马(Gamma) sRGB 色彩空间(Color Space) 总结 转色彩空间后出现问题的缘由 1.相同场景材质和光照为什么变暗了? 2.个人定制化的PBR显示不正确了?(讨论的是 ...
- 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...
基于windows PE文件的恶意代码分析:使用SystemInternal工具与内核调试器研究windows用户空间与内核空间 ******************** 既然本篇的主角是PE文件,那 ...
- Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)
Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法 Caputo 分数阶一维问题基于 L1 逼近的快速差分方法(附Matlab程序) 文章目录 Caputo 分数阶一维问题基于 L1 逼近的空 ...
- 空间规划师的坐标系转换手册(国家2000大地坐标系适用)(转载)
声明:本文所指空间规划师特指城乡规划师,此处仅在标题名称提法上与国家空间规划体系改革相呼应,文中仍以规划师或城乡规划师相称,并无额外之意,请勿过度解读:封面图片来自于网络,版权归原作者所有. 随着自然 ...
- 色彩空间转换(RGB空间与Lab空间)
颜色迁移是计算机视觉领域的一个很有趣的问题,它实际上要我们解决这么一个问题:基于图像A和图像B,合成一幅新的图像C,使其同时具有A的颜色和B的形状等遗传信息,即图像B在不改变它自身所表达的形状信息的情 ...
- 【转】UNITY中相机空间,投影空间的正向问题
原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...
最新文章
- [微信小程序]提交表单返回成功后自动清空表单的值
- 知识图谱在信息检索中的应用_如何使用知识图谱增强信息检索模型?
- 美团技术 mysql_美团MySQL数据库巡检系统的设计与应用
- fseek获取大于4G的文件大小的问题
- C语言学习之输入4个整数,要求按由小到大的顺序输出。
- python里、能用分支结构写出循环的算法吗_python变量运算符分支结构循环结构及例题...
- WEB可以调节的框架页
- 【转】PF_INET 和 AF_INET 的区别
- mysql c api example_The MySQL C API 编程实例
- 作者:孙宗哲(1991-),男,东北大学软件学院硕士生
- SpUtil多样加密存储,兼容android9.0
- 如何简单解释 MapReduce算法
- spring mybatis mysql 事务不起作用
- Int.Parse()、Convert.toInt32()和(int)区别
- 【学习0605】NVIDIA DRIVE AGX Developer Kit - How to set up
- synergy共享屏幕
- 2021全国大学生数学建模竞赛B题摘要及总结
- HearthBuddy 调试肯瑞托法师寒冰屏障的配合
- Web安全深度剖析第三章读书笔记
- 人工智能学期心得体会