Gamma空间精简讲解

GammaCorrection起源于CRT显示器的非线性输出问题,但现在它更多地与人眼对亮度感知相关。人眼对低亮度变化更敏感,Gamma校正通过非线性操作优化图像信息,保留更多暗部细节。在处理图像时,通常需要在着色器中进行幂运算以适应线性与非线性颜色空间的转换。 Gamma校正的关键在于理解人眼感知和图像处理之间的平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在查找相关资料的过程中,看到了很多人争论,出现Gamma Correction到底是人对自然亮度的感知原因,还是由于早期的 CRT 显示器存在非线性输出的问题。在研究了一些Gamma Correction资料后,个人认为早期Gamma Correction的出现是由于原来的 CRT 显示器存在非线性输出的问题,而在显示器完全可以解决非线性输出的问题的今天,Gamma Correction的存在更多的是由于人对自然亮度的感知。

人眼对环境光的不是随着光的强度线性增加的,越暗的地方,变化感受越明显,设1为白色,当环境为白色的0.2的时候,人眼感受的已经是0.5了:

Gamm校正的定义:Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:这个指数即为Gamma.

 

由于图像信息保存位数是有限的,为了更大限度的保存人眼能识别的颜色范围,需要多保存暗处信息,少保存亮度信息,因此照相机这保存图像是需要对原始颜色做个gamma校正,一般pow(0.45),这样图片保存的颜色空间就在gamma空间了。至于为什么是0.45这就是人眼的问题了。

 

一般图片RGB色彩都是在gamma空间内,gamma空间内的颜色直接计算,结果是错的,因为已经是非线性的颜色空间。如果在shader中想使用线性颜色空间,需要可以在着色器里来做类似实现:对传进来的贴图做幂为2.2的pow()函数处理,然后在颜色返回值前做幂为0.45的pow()函数处理。

### Unity 中 Gamma 空间的使用和原理 #### 定义与背景 在计算机图形学中,Gamma校正是指调整图像亮度的过程,使得最终显示效果更接近人类视觉感知。对于8位颜色表示来说,由于其有限的颜色范围,通常会对这些颜色应用伽马编码来更好地利用这256级灰度[^3]。 #### Unity中的实现方式 当Unity项目设置为Gamma工作流时,意味着所有的光照计算以及材质属性都将按照传统的非线性响应曲线来进行处理。这意味着纹理贴图不会被解码成线性的RGB值再参与渲染方程式的运算;相反,它们保持原有的gamma压缩状态直到最后一步才进行适当的转换以便于屏幕呈现[^1]。 #### 对美术资源的影响 如果艺术家们提供了已经过gamma矫正的素材(通常是8-bit每通道),那么在Gamma模式下的引擎可以直接使用这些图片而无需额外的操作。然而需要注意的是,这种做法可能会引入一些精度损失特别是对于中间色调区域因为量化误差所致[^5]。 #### 特殊情况考虑 尽管大多数情况下默认采用Gamma空间可以满足需求,但在某些特定应用场景比如HDR高动态范围成像或是涉及复杂的物理模拟时,则可能需要切换到Linear WorkFlow以获得更加精确的结果并减少因多次幂律变换带来的累积失真问题[^4]。 ```csharp // 设置当前使用的色彩空间Gamma (通过Player Settings配置) if (!SystemInfo.supportsRenderTextureFormat(RenderTextureFormat.Default)) { Debug.LogWarning("Current device does not support default render texture format."); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值