首页 > 其他分享 >[Unity/Gamma校正]通俗解释Gamma空间

[Unity/Gamma校正]通俗解释Gamma空间

时间:2024-03-07 16:58:24浏览次数:34  
标签:校正 纹理 勾选 Unity SRGB 灰度 Gamma

经常接触纹理制作或是shader编写应该多多少少都听说过Gamma校正

Gamma校正本身很好理解,\(Gamma\ =\ Linear^{2.2}\)

通过\(pow2.2\)这条曲线,将线性的颜色值映射到非线性

 

耳熟能详的案例是中灰值

 

人眼对灰度的感知不是线性的,如果线性地显示深度会觉得中灰偏亮

这是因为人眼对于暗部更加敏感,对于线性的灰度值,人眼得到的暗部信息和亮部对半,因此在非线性映射之后,暗部信息更多了,就更符合人眼的直觉了。

这就是所谓的gamma校正

而CRT显示器输入电压与输出亮度的 2.2曲线则似乎是一个巧合,不过时至今日我们使用的显示器依然会默认对输出亮度进行 pow2.2 的映射。

 

线性空间与gamma空间

(个人认为使用空间描述有些反直觉,无法直观地理解灰度的整个输出过程)

我们在使用PS等绘图软件时,能够发现其中的渐变工具其实是非线性的

将PS中0.5的灰度值导出为贴图导入unity,来看看unity中其真实的灰度值为多少。

 

ColorSpace 设置为 Gamma

纹理勾选SRGB

直接输出纹理

纹理取消勾选SRGB

直接输出纹理

纹理勾选SRGB

判断灰度值是否为0.5(白色表示是)

 纹理取消勾选SRGB

判断灰度值是否为0.5

 

当Unity的色彩空间设置为Gamma空间时,勾选SRGB无意义。

PS在SRGB空间下输出的中灰值,在Unity的Gamma空间中也是0.5

有意思的事情发生在将Unity的色彩空间改为Linear时。

ColorSpace 设置为 Linear

纹理勾选SRGB

直接输出纹理

 纹理取消勾选SRGB

直接输出纹理

 纹理勾选SRGB

判断灰度值是否为0.5

 纹理取消勾选SRGB

判断灰度值是否为0.5

 

勾选SRGB意味着什么呢?

通过上面四张图可以得出结论,在Linear空间下,勾选SRGB之后,纹理的灰度值不再是0.5

事实上这个值是0.217左右,是 0.5 的 2.2 次方

而勾选了SRGB之后,灰度值则回到了0.5

在前两张图中也可以看出勾选SRGB之后颜色更深。

而在Gamma空间下,勾选SRGB并没有影响纹理的灰度值。

 

我们可以这样认为,将色彩空间设置为Gamma,那么Unity会将所有纹理输出时自动进行pow2.2的操作

相当于自动在shader最后加了一句pow2.2,并且此时SRGB失效。

这就要求,我们在生产纹理时使用的是SRGB空间,即输出值为0.5,表现为美术中灰。

 

在Linear空间下,只有当我们勾选SRGB时,输出的纹理才是符合预期结果的

此时纹理的灰度值为0.217,勾选SRGB这个操作对纹理进行了一次 pow2.2的操作。

取消勾选则纹理的灰度值为正常的0.5

 

也就是说,设置Gamma空间与勾选SRGB的效果类似

前者是统一对纹理进行校正操作

后者是对单独纹理进行校正操作

 

这就是Gamma校正在Unity中的主要应用。

 

为什么需要线性空间?

因为许多图形学算法需要在线性空间下进行计算,而不是人眼的感知曲线。

事实上,所谓的线性空间,也只是变化需要是线性的,最终的效果与人眼的感知效果应该是一样的。

 

如果将PS的颜色空间设置为Linear,那么如果我们要输出美术中灰,其灰度值将会是0.217

这也要求我们将Unity的色彩空间设置为Linear,并且取消勾选SRGB

否则Unity会对纹理再进行一次映射,最终图像会被压暗。

 

一般的正确工作流程是这样的:

PS使用SRGB,Unity色彩空间设置为Gamma,纹理勾不勾SRGB无所谓,Shader采样纹理后正常计算颜色,无需手动校正直接输出。

这种情况,在Gamma空间下,纹理本身灰度是可以线性计算的,最终会被统一校正。

 

PS使用SRGB,Unity色彩空间设置为Linear,纹理勾选SRGB,Shader采样纹理后,进行 pow(1/2.2) 的校正再计算颜色,计算完成后,再 pow2.2 校正回去输出。

这种情况下,因为纹理勾选了SRGB,灰度值被校正到了0.217,已经不在线性空间了,我们需要的是对0.5进行计算,所以需要手动校正回线性空间,输出时再校正回去。

 

PS使用Linear,Unity色彩空间设置为Linear,纹理不勾选SRGB,Shader采样纹理后正常计算颜色,无需手动校正直接输出。

这种情况,是相同的Linear空间,我们直接计算线性空间下的颜色,所见即所得,无需校正。

 

主流的做法是前两种。

标签:校正,纹理,勾选,Unity,SRGB,灰度,Gamma
From: https://www.cnblogs.com/IslandZ/p/17930269.html

相关文章

  • Unity3D 渲染队列 ZTest与ZWrite详解
    在Unity3D中,渲染队列(RenderingQueue)是一个非常重要的概念,它决定了游戏中各个物体的渲染顺序和优先级。而在渲染队列中,ZTest和ZWrite又是两个关键的参数,它们决定了物体在渲染的过程中如何处理深度测试和深度写入。本文将详细介绍Unity3D中的渲染队列、ZTest和ZWrite的概念,并给出相......
  • Unity3D 立方体纹理与自制天空盒详解
    在Unity3D中,立方体纹理和自制天空盒是常见的技术,它们可以帮助开发者创建出更加真实和引人入胜的游戏场景。本文将详细介绍Unity3D中立方体纹理和自制天空盒的实现方法,希望能帮助读者更好地理解和运用这些技术。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小......
  • Unity3D 多人战场Animation优化详解
    在多人战场游戏中,动画的优化是非常重要的,因为动画是游戏中的核心元素之一,直接影响玩家的游戏体验。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在本文中,我们将详细介绍如何在Unity3D中优化多人战......
  • iOS使用Unity容器动态加载3D模型
    项目背景我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。对于Unity容器来说,需要满足如下的功能:1.在APP启动时,需要满足动态下载最新的模型文件。2.在点击藏......
  • 【RS】Sentinel-2哨兵二号数据预处理(大气校正、重采样、波段组合)
    ​    刚分享过新版欧空局的数据下载教程,正好把哨兵2号预处理的教程也分享一下,主要就是使用官方插件Sen2or对L1C级数据进行大气校正,使用SNAP软件对L2A级数据进行重采样并导出ENVI可以打开的格式,最后使用ENVI对重采样后的数据进行波段组合,以便于后期的定量分析。1.软件......
  • 基于unity和c#的障碍跑酷游戏的二次开发
    一、设计背景近年来,虚拟现实技术取得了突飞猛进的发展,为游戏行业带来了新的机遇。通过将跑酷游戏与虚拟现实技术相结合,可以为玩家提供更加真实、沉浸式的游戏体验,让玩家仿佛置身于现实世界中的跑酷场景中。现代游戏越来越注重玩家之间的互动和竞技。跑酷游戏可以设置多人在线模......
  • Unity3D 常用得内置函数(Cg与GLSL)详解
    Cg和GLSL是Unity3D中常用的着色器语言,通过使用这两种语言,开发者可以实现各种精美的视觉效果。本文将详细介绍Unity3D中常用的一些内置函数,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大......
  • DELL EMC unity demo
    1.unity介绍Unity属于DellEMC推出的中端存储阵列,其既支持文件存储,也支持块存储,还拥有丰富的数据服务功能,旨在满足客户对灵活性、实惠性和简洁性的需求。DellEMCUnity产品线包括Hybrid(SSD+机械硬盘)类型的300/400/500/600型号,以及全闪存的300F/400F/500F/600F型号,以及......
  • Unity引擎关于APP后台下载支持的实现问题
    1)Unity引擎关于APP后台下载支持的实现问题2)Prefab对DLL中脚本的引用丢失3)UnityDOTS资源加载问题4)UnitySendMessage和_MultiplyMatrixArrayWithBase4x4_NEON调用导致崩溃这是第376篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更......
  • Unity3D Shader常用数据类型详解
    Unity3D中Shader是用来控制3D物体的外观和表现的一种特殊编程语言。在Shader中,有一些常用的数据类型,了解这些数据类型对于编写高效的Shader非常重要。本文将详细介绍Unity3D中Shader常用的数据类型,并给出相应的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热......