原文:原文! 相关文章:https://blog.csdn.net/u011618339/article/details/80842486
伽马空间: 美术出图是在伽马空间下,贴图本身会被进行伽马校正 一般是sRGB伽马空间【gamma = 2.02】
伽马校正算法: output = input^(1/gamma) (^是求幂运算符)
在输出显示器时,显示器会自动对它进行相应的伽马变换。
伽马变化算法:output = input^(gamma)
即在伽马空间下,若美术出图时是在伽马空间下进行的,则会先对图片像素进行(1/gamma)次方运算,在输出时由硬件自动进行gamma次方输出到显示器。
但此时的输出结果是和真实结果略有差异,但也不能说是完全错误的。
线性空间:sRGB Frame Buffer 是常用的线性颜色空间
美术出图时要在线性空间下出图,线性空间出的贴图不会进伽马校正,而是保持原始图片的颜色值输出到贴图。
然后,它会在输出到显示器前,用sRGB Frame Buffer的其中几个API进行伽马校正,然后再传给显示器做伽马变换输出,此时是效果是正确的。
PS:如果美术出的图是sRGB伽马空间下的,可以勾选贴图的sRGB(Color Texture)选项进行反向sRGB操作回到线性空间贴图即可。
为什么线性空间是真正的情况,而伽马空间不是?
我猜测可能是在线性空间时,贴图的像素颜色纸保持原始一样,进入渲染流程进行处理,仅仅在输出显示器前一步,进行了伽马校正,
伽马校正也只是为了抵消之后输出到显示器时的伽马变化,所以这里的伽马校正不会影响渲染流程!而伽马空间的情况恰恰相反,它是在
渲染流程之前就已经对贴图进行了伽马校正,从而将贴图整体颜色值拔高了,然后进行的渲染处理,这里就肯定会影响到渲染情况了,从而并非真正的情况。
为什么会有sRGB伽马空间和sRGB Frame Buffer线性空间?
个人猜测无非以下原因:
原本是只有线性空间的,即不会做伽马变换处理,但后来人们发现人眼识别黑色区域比光亮区域更敏感,所以将在显示到屏幕之前进行了一个伽马变换,伽马变换会将[0,1]的数变得更小,
即整体变暗,从而让视觉效果更好看,但这已经并非真实的效果了,后来好像有了手段不需要做这种伽马变换就能达到同样的视觉效果了,但由因为伽马变换已经根深蒂固地嵌入了硬件里,所以诞生了伽马校正。 伽马校正是伽马变换的反向操作,就是为了抵消掉伽马变换的影响的。
一开始人们想不到办法在输出之前控制渲染流程进行做伽马校正,所以有了sRGB伽马空间的做法,即将贴图的信息提前进行了一次伽马校正,然后再进入渲染流程,输出到屏幕时做伽马变换就能恢复回原图情况,但人们没想到这种效果并非真实,因为上面我所猜的情况可能就是会有影响到渲染细节问题。
紧接着就理所当然地想到了可以在渲染流程最后一步,即显示到显示器前,进行线性空间sRGB Frame Buffer相关处理,简单来说就是贴图保持原样进行渲染,将渲染结果先缓存到这个Buffer然后做伽马校正,然后再传递给显示器进行伽马变换输出到屏幕。