可以参考:
  1.http://blog.csdn.net/ngrandmarch/article/details/46407017
  2.http://blog.csdn.net/candycat1992/article/details/46228771
关键是文2,但文2许多东西都只是“作者知道,读者不知道,但作者以为读者知道”,文1可以辅助理解。
  首先文1的内容应该是正确的,我再加几点帮助在文1的基础上理解文2提到的几个观点。
    0.线性纹理输出屏幕上,因为colorbuffer到屏幕的影响(硬件),得到的颜色会是(0-1)^2.2.
    1.sRGB格式意思是0-1映射到(0-1)^(1/2.2)=(0-1)^0.45,也就是说sRGB格式的图片是非线性纹理。
    2.如果sRGB格式的纹理不经过色值缩放直接经过shader输出到colorbuffer,因为colorbuffer到屏幕上需要进行col^(2.2),所以屏幕上刚好是原来的颜色。
    3.但是,如果sRGB格式的纹理的色值在shader里进行了缩放,比如文2中的颜色混合,那输出到屏幕的结果是:((0-1)^0.45 * scale)^2.2,这个显然是错误的,毕竟我们想要的是(0-1)*scale。
    4.采用sRGB格式的本质原因是颜色的精度太低,而人的眼睛对暗部分变化比较敏感,所以需要让更多的精度来表示暗的部分,所以搞了个0.45次方映射:(0-1)=>((0-1)^0.45),后者的范围依然是(0-1)只是更多位数来表示暗的部分了:0.18^0.45=0.5=>有一半精度表示0-0.18之间的亮度,一半表示0.18-1之间的亮度。
  

  下面看unity的gama space 和 linear space:
    5.但是,unity的linear space帮我们做了一些处理:对输入纹理先进行^2.2变换到线性空间,然后进行shader处理,当输出到colorbuffer时再^0.45回归sRGB格式即gama空间,这样shader里的缩放等处理都是对原色值进行线性处理了。但是呢,这里默认了输入纹理是sRGB,如果你的输入是线性的,那就直接出错了!,可以通过勾选纹理设置的bypass srgb sample来越过^2.2和^0.45的空间转换处理,现在Unity默认都把图片搞成sRGB格式,所以linear space是正确的显示。
    6.unity的gamma space没有做任何事情,即没有做输入转换到线性空间和输出转回gamma空间,这个时候,对于线性纹理,输出会是((0-1)*scale)^2.2,对于sRGB格式:((0-1)^0.45 * scale)^2.2,都特么是错的。前者很容易矫正,但sRGB格式可以更好的表现暗域,这估计也是unity默认转成sRGB格式的原因。
    7.unity默认对纹理都搞成sRGB格式(通过勾选纹理设置的bypass srgb sample课可以搞成线性的),并且在PC上可以选择linear space,手机上只能选择gama space,这意味着我们的手游需要gama矫正:

     在采样时先转线性空间:

      float3 diffuseCol = pow(tex2D( diffTex, texCoord ), 2.2 );
     然后在输出时再转gama 空间:

      fragColor.rgb = pow(fragColor.rgb, 1.0/2.2);return fragColor;,

     但是但是,因为片段着色器的结果并不是直接写得colorbuffer里面的,所以我们做的线性空间转回gama空间做早了,这有可能会出问题!因为gama 矫正的正确操作是(unity linear space做的):
      一切工作都是为了“保证所有的输入都转换到线性空间,并在线性空间下做各种光照计算,最后的输出(最最最最后的输出)进行伽马校正后再显示”。这个最后的输出是colorbuffer。
    但事实上,即使我们不进行gama矫正也没什么,因为我们的shader又不是万能的,调整各种参数满足表现就好了嘛,又不是动态变化的。不过如果你的shader的亮度看起来不如意,有可能是没进行gama矫正导致的,知道就好。

    8.存疑:

      1.所谓sRGB格式是存储的格式还是读到GPU里的格式?按说unity不会直接改导入图片的信息,那应该是GPU读原始纹理后进行处理的格式了,但没看到文档不敢揣测。

      答:unity不会改导入图片的信息,但图片被导入后会根据设置在Library目录生成一个对应的文件,给游戏使用,所以sRGB就是存储的格式。

      2.许多游戏场景因为没有gama矫正而变暗,为什么?

      答:其实这点我没查到原理,仅根据公式推:因为当scale在0-1之间时,scale^2.2比scale小,所以偏暗。

Gama Space 和 Linear Space 学习的更多相关文章

  1. User space 与 Kernel space

    学习 Linux 时,经常可以看到两个词:User space(用户空间)和 Kernel space(内核空间). 简单说,Kernel space 是 Linux 内核的运行空间,User spa ...

  2. Kernel Space与User Space(转)

    对于刚刚接触Linux的菜鸟来说,可能会不理解大家常说的Kernel Space和User Space是什么意思,我简单搜了一下,发现阮一峰写过一个比较简洁的介绍,贴下来给大家: 学习 Linux 时 ...

  3. 关于sed中的Pattern Space和Hold Space的随笔

    首先是一部分概念和示例,这部分转自:http://coolshell.cn/articles/9104.html Pattern Space 第零个是关于-n参数的,大家也许没看懂,没关系,我们来看一 ...

  4. JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

    以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两 ...

  5. JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释(转)

    jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  6. JVM内存区域划分Eden Space,Survivor Space,Tenured Gen,Perm Gen

    jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

  7. JVM内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)

    JVM区域总体分两类,heap区和非heap区.heap区又分为: Eden Space(伊甸园). Survivor Space(幸存者区). Old Gen(老年代). 非heap区又分: Cod ...

  8. Permanent Space 和 Heap Space

      JVM堆内存 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

  9. 法线从object space到eye space的转换((normal matrix)

    对于顶点来说,从object Space转换到eye space, 使用model-view矩阵就好了.那么顶点的法线是否也可以直接使用model-view矩阵转化? 通常情况下是不行的. 如下两张图 ...

随机推荐

  1. 关于SqlServer那些事1(回归基础)

    即将实习,回归基础总结,希望可以再好好打磨一下基础的一些东西 关于如何在重新修改表结构时该变其权限设置 步骤: 点击工具 进入选项 设计器 取消勾选阻止保存要求重新创建表的更改 关于创建创建数据库以及 ...

  2. 基于.NetCore3.1系列 —— 日志记录之日志核心要素揭秘

    一.前言 在上一篇中,我们已经了解了内置系统的默认配置和自定义配置的方式,在学习了配置的基础上,我们进一步的对日志在程序中是如何使用的深入了解学习.所以在这一篇中,主要是对日志记录的核心机制进行学习说 ...

  3. HTML5 plus是什么?

    1.HTML5 plus 1.1 提出问题 如果大家使用过MUI框架,看到下面的代码就不会感到陌生. mui.plusReady(function(){ var self = plus.webview ...

  4. CSS基础知识(下)

    3.层叠 稍微复杂的样式表中都可能存在两条甚至多条规则同时选择一个元素的情况.CSS通过一种叫作层叠(cascade)的机制来处理这种冲突. 层叠机制的原理是为规则赋予不同的重要程度.最重要的是作者样 ...

  5. C# ASP 分析器错误信息: 无法识别的属性“targetFramework”。请注意属性名称区分大小写。

    在本地运行的应用,部署到服务器上出现错误.原因是web.config 中:<compilation debug="true" targetFramework="4. ...

  6. jQuery 基本用法

    1)页面加载完成后开始运行do stuff when DOM is ready 中的语句! $(document).ready(function() { // do stuff when DOM is ...

  7. 2020-07-09:mysql如何开启慢查询?

    福哥答案2020-07-09: 1.参数说明 slow_query_log 慢查询开启状态slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般 ...

  8. .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。

    介绍: 目前微软还没有跨平台桌面程序的开发框架.github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia.avalonia 采用 Xaml+C#,类似于wpf,可运行于.netf ...

  9. BiLSTM:序列标注任务的标杆

    Bidirectional LSTM-CRF Models for Sequence Tagging. Zhiheng Huang. 2015 在2015年,本文第一个提出使用BiLSTM-CRF来做 ...

  10. Oracle用户授权

    一.用户授权 1)普通权限 grant ${autoType1, autoType2, autoType3, ...} to ${userName} identified by ${password} ...