threejs交流群511163089
sRGB
sRGB是个啥 s是standard 是大厂为了统一标准搞的色彩空间 对应了gamma0.45空间。
然后是伽马矫正 gammaxx空间就是那个幂 伽马2.2就是2.2次方 1.0就是1次方。
从0-1这个区间,l=u这个函数才是直线,2.2次方会导致凹陷,于是要给他补回去,欸对 这就是矫正。
然后怎么矫正,你最后一步输出之前需要来个1/2.2也就是约0.45次方的调整。
然后为啥有这一步,由于显示器输出的时候会给你的数据来一个2.2次方。
那么相当于 sRGB的图片 shader里texture2d一下,直接给他output那就完了。
但对于光照计算就弯曲一点,要sRGB给他弄到1.0空间,也就是正常空间,然后算光照,然后算完了,又给他手动调回0.45空间,等显示器给你2.2一下,就是输出的正常颜色了
HDR
就是本身啊rgba在显示的时候都会被截断到1,大自然的颜色那么多,超过1很正常,那截断了,颜色信息就丢失了很多。
那肯定希望能少丢失一点是一点。
那要弄一个浮点帧缓冲装一下,普通格式数据会被直接截断。
浮点的第一步就是数据上不截断1,存的数据可大于1
采样还是这么个采样法,但是值不一样了,能采样出来大于1的值,不过喃 最后输出还是会被截断0-1。
那就是第二步骤了,截断之前做点事情 tonemapping
这例子是Reinhard色调映射,有别的算法,找一找总有令你满意的。
这个值越大,越恢复的好,值越接近0,越丢失严重,明显这一款是喜欢高亮度细节的算法。
这里tonemapping之后,要输出到屏幕了,记得上面那事情吧 显示器有个gamma2.2空间操作,你要给他来个gamma0.45操作。
完整一套HDR加矫正操作如下
以上内容是读两篇文章的个人理解
Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗? - 知乎 (zhihu.com)
HDR - LearnOpenGL CN (learnopengl-cn.github.io)