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空间转换代码相关推荐

  1. Unity Gamma Linear Color Space

    转载文章,出自http://www.manew.com/thread-105872-1-1.html,作者 alphatt Gamma & Linear Color Space 一.真实?感觉 ...

  2. URP下Alpha从Gamma空间到Linner空间转换(一)——Alpha贴图不叠加

    文章目录 问题描述 解决办法: 添加GammaToLinearSpace转换,添加三句 完整Shader: 问题描述 中间是默认的UI贴图,因为unity勾选SRBG,不处理Alpha通道,所以可能出 ...

  3. Unity的gamma矫正、颜色空间及其转换的问题

    Unity的gamma矫正.颜色空间及其转换的问题 1,伽马矫正 2,unity的颜色空间 2.1两种颜色空间流程 2.2pbr贴图格式 2.3手动完成空间切换 2.4升级URP后亮度不一致问题的问题 ...

  4. Unity内置管线升级URP之色彩空间(伽马、sRGB、Gamma Space和Linear Space)

    目录 本文内容 伽马(Gamma) sRGB 色彩空间(Color Space) 总结 转色彩空间后出现问题的缘由 1.相同场景材质和光照为什么变暗了? 2.个人定制化的PBR显示不正确了?(讨论的是 ...

  5. 基于windows PE文件的恶意代码分析;使用SystemInternal工具与内核调试器研究windows用户空间与内核空间...

    基于windows PE文件的恶意代码分析:使用SystemInternal工具与内核调试器研究windows用户空间与内核空间 ******************** 既然本篇的主角是PE文件,那 ...

  6. Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)

    Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法 Caputo 分数阶一维问题基于 L1 逼近的快速差分方法(附Matlab程序) 文章目录 Caputo 分数阶一维问题基于 L1 逼近的空 ...

  7. 空间规划师的坐标系转换手册(国家2000大地坐标系适用)(转载)

    声明:本文所指空间规划师特指城乡规划师,此处仅在标题名称提法上与国家空间规划体系改革相呼应,文中仍以规划师或城乡规划师相称,并无额外之意,请勿过度解读:封面图片来自于网络,版权归原作者所有. 随着自然 ...

  8. 色彩空间转换(RGB空间与Lab空间)

    颜色迁移是计算机视觉领域的一个很有趣的问题,它实际上要我们解决这么一个问题:基于图像A和图像B,合成一幅新的图像C,使其同时具有A的颜色和B的形状等遗传信息,即图像B在不改变它自身所表达的形状信息的情 ...

  9. 【转】UNITY中相机空间,投影空间的正向问题

    原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...

最新文章

  1. [微信小程序]提交表单返回成功后自动清空表单的值
  2. 知识图谱在信息检索中的应用_如何使用知识图谱增强信息检索模型?
  3. 美团技术 mysql_美团MySQL数据库巡检系统的设计与应用
  4. fseek获取大于4G的文件大小的问题
  5. C语言学习之输入4个整数,要求按由小到大的顺序输出。
  6. python里、能用分支结构写出循环的算法吗_python变量运算符分支结构循环结构及例题...
  7. WEB可以调节的框架页
  8. 【转】PF_INET 和 AF_INET 的区别
  9. mysql c api example_The MySQL C API 编程实例
  10. 作者:孙宗哲(1991-),男,东北大学软件学院硕士生
  11. SpUtil多样加密存储,兼容android9.0
  12. 如何简单解释 MapReduce算法
  13. spring mybatis mysql 事务不起作用
  14. Int.Parse()、Convert.toInt32()和(int)区别
  15. 【学习0605】NVIDIA DRIVE AGX Developer Kit - How to set up
  16. synergy共享屏幕
  17. 2021全国大学生数学建模竞赛B题摘要及总结
  18. HearthBuddy 调试肯瑞托法师寒冰屏障的配合
  19. Web安全深度剖析第三章读书笔记
  20. 人工智能学期心得体会

热门文章

  1. 当shell命令键盘侠dadada!会的眨眨眼!
  2. 毕业设计-基于微信小程序的文件加密系统
  3. 为什么计算机专业叫宇宙机,有一说一 末流985天坑专业和宇宙机的差距真的蛮大的...
  4. GeoServer系列-REST接口初识
  5. 适合运动的蓝牙耳机有哪些型号、适合运动的蓝牙耳机推荐
  6. win10共享计算机win7,win10与win7系统电脑通过局域网共享打印机的方法
  7. Visio保存图片不清晰
  8. 【计算机科学基础】计算机系统
  9. 【算法案例】人脸自动补全
  10. LCS最详细题解!!!!!