这个话题一直是我的一个困扰,因为我看了Unity Shader的讲解,总感觉作者是不是把问题搞反了,前后叙述是矛盾的。后来经过反复查看,可以肯定作者是对的,但是因为表述不清楚或者太啰嗦,把一些重点给掩盖在了文字里边,现在我要来重点梳理一下干货:
一、为什么要使用伽马编码
人眼对颜色的感知并非线性,对于暗的颜色变化敏感,对于亮的颜色变化不敏感:
由此引发一个问题,当我们使用摄像机拍照,如果按照0-255来线性记录颜色,则对于记录暗色调128颜色与亮色调128颜色来说,记录暗色调意义更大 ,应该是要分配更多的空间用于记录暗色调。
二、如何实现
比如将颜色映射到0-1空间,我们应该是希望让颜色按照虚线变化进行映射存储值:
让越小的x值映射到越广的y空间,将y作为像素值存到图片纹理中。
比如,一束光线照进了摄像机镜头,亮度为0.22(暗),采用编码伽马后取值V:
<