可以参考:
  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. 28-关键字:static

    static:静态的 1.可以用来修饰的结构:主要用来修饰类的内部结构 >属性.方法.代码块.内部类 2.static修饰属性:静态变量(或类变量) 2.1 属性,是否使用static修饰,又分 ...

  2. 【Python 实例】面向对象 | 按相反的顺序输出列表的值

    [Python 实例]面向对象 | 按相反的顺序输出列表的值 题目: 解答: 运行结果: 题目: 按相反的顺序输出列表的值 解答: """ 按相反的顺序输出列表的值 &q ...

  3. 《第22条军规》Catch-22

    也许我们能注意到,英语里“军规”和“圈套”是同一个词. <第二十二条军规>是约瑟夫·海勒的代表作,小说以第二次世界大战期间驻扎在皮亚诺扎岛上的一支美国飞行队为背景,描写飞行员约瑟连(YOY ...

  4. python基础语法和实战练习

    (一)Python基础学习 Num01:python的基本数据类型 ①字符串:可进行拼接和截取 ②数字:int,float,complex(复数) 涉及到格式转换:int(x)转换为整数,float( ...

  5. Hive对字段进行urlDecode

    最近项目中需要对埋点日志hive表进行分析,并且按一定的规则统计出来满足要求的用户pin.本来以为是一件比较简单的事,结果在查看导出的词表时发现很多带有"%"的明显具有url en ...

  6. Bytom 储蓄分红 DAPP 开发指南

    储蓄分红DAPP 储蓄分红合约简介 储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润.用户可以在 ...

  7. CUDA线程、线程块、线程束、流多处理器、流处理器、网格概念的深入理解

    一.与CUDA相关的几个概念:thread,block,grid,warp,sp,sm. sp: 最基本的处理单元,streaming processor  最后具体的指令和任务都是在sp上处理的.G ...

  8. html定时跳转页面

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. ZoneJS 的原理与应用

    目录 序言 Zone 是什么 ZoneJS 的原理 ZoneJS 的应用场景 参考 1. 序言 ZoneJS 是 Angular 团队受到 Dart 的 Zone 的启发,为 Angular v2 及 ...

  10. keil 5.29 无法找到 flash的算法文件

    安装5.29之后,发现编译文件可以,但是Debuger下的flash download找不到对应的flash文件 解决, 重新 安装keil5.29时,PACK的目录选择安装在Keil同级目录下的AR ...