【Unity3D日常开发】Unity3D的Color Space(颜色空间)【全解析】

news2024/11/17 4:23:12

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

Edit→Player Settings→Other Settings→Rendering→Color Space(颜色空间)

先放一张图感受一下:
在这里插入图片描述
在Unity打包选项中,有一个Color Space的选项,有GammaLinear两个选项。

主要作用是设置Unity是否对输入的默认贴图进行转换处理,法线贴图不存在这个问题。

Gamma时,Unity不会在后台将图片进行转换,输入的即使是经过矫正的图片,Unity也不会处理,比如Remove Gamma Correction去除伽马校正Gamma Correction伽马校正都不会发生,除非自己手动实现。

Linear时,Unity就会进行统一线性空间的流程,也就是Gamma Correction,对于sRGB纹理,Unity 会利用GPU对图片进行采样,剔除矫正Remove Gamma Correction,转换到线性空间,然后再传给Shader处理,处理后的图片会再加上Gamma矫正,再显示在屏幕上。

简而言之就是Gamma不会对输入和输出进行处理,Linear会对sRGB纹理进行剔除矫正,转换到线性空间,再传给Shader处理

那接下来,我们就来了解一下Gamma和Linear的原理,以及支持Linear颜色空间的纹理类型,还有支持线性空间的硬件和特性。

二、正文

2-1、纹理与Linear

Unity在导入贴图的导入设置面板中sRGB(Color Texture)选项,勾选它,告诉Unity这是一张sRGB贴图,需要对sRGB编码才可以获得用于光照计算的数据,不勾选,表示这是一张线性贴图,这张贴图的颜色数据可直接用于光照计算。

当然,除了sRGB(Color Texture)选项,其他的类型,比如Normal Map、Light Map都是Linear,设置好类型Unity自己会处理它们。
在这里插入图片描述
在这里插入图片描述

那什么时候才会用到sRGB贴图呢?

比如在导出贴图时,会对提供色彩信息的贴图,比如Albedo和Specular Color做sRGB编码,这样做的目的是为了让贴图看起来更舒服,更符合人眼感知的方式。

所以,这种情况就可以导出sRBG贴图来使用。但是对于法线贴图、金属度贴图这类用于存储数值信息的贴图,是不做sRBG编码的,所以就当线性贴图来使用。

2-2、什么是sRGB

上述说的解码Gamma只是理想状态下机制。

然而每一台显示器的解码值Gamma值并不统一,会导致同一张图片再不同的显示器上看起来不一样。

解决方案是引入Color Profile(色彩配置文件),也就是RGB数值与颜色波长之间的对应关系。

图片都再带有一个Color Profile,显示器收到这个文件后,根据显示器自己的Color Profile后转换为屏幕输出该特定波长所需的RGB值。

也就是说Color Profile既有波长这个量值,也有Gamma矫正。

sRGB是一种最常见的Color Profile,是微软联合惠普等厂商联合制定的色彩标准。

sRGB色彩空间就是Gamma色彩空间。

2-3、硬件特性支持

主要由两个硬件特性来支持:

sRGB Frame Buffer

  • 将Shader的计算结果输出到显示器前左gamma校正
  • 作为纹理被读取时会自动把存储的颜色从sRGB空间转换到线性空间
  • 调用ReadPixels()、readBackImage()时,会直接返回sRGB空间下的颜色
  • sRGB Frame Buffer只支持每通道8bit的格式,不支持浮点格式
  • HDR开启后会先把渲染结果绘制到浮点格式的FB中,最后绘制到sRGB FB上输出
    sRGB Sampler
  • 将sRGB的贴图进行线性采样的转换
  • 使用硬件特性完成sRGB贴图的线性采样和shader计算结果的gamma校正,比起在shader里对贴图采样和计算结果的校正要快。

2-4、线性空间 Linear Space

在现实世界中,光的强度增加一倍,那么亮度也会增加一倍,这是线性关系。

为了保证数学上准确,光照计算应该在线性空间执行,意即sRGB格式的输入值需要先做sRGB解码——在贴图的导入设置面板中有**sRGB(Color Texture)**选项。

如果勾选开启sRGB,那么在采样时会自动对采样得到的值进行sRGB解码

此外还设置有一个sRGB格式的buffer,GPU会在shader写入color buffer前自动进行sRGB编码

这里用到了两个底层图形API:sRGB SamplersRGB Frame Buffer
在这里插入图片描述

(如果unity使用Gamma颜色空间,sRGB的设置是无效的,因为贴图总是会被线性采样。)

sRGB (Color Texture)设置的意义:这应该总是检查非hdr颜色纹理(如反照率和高光颜色)。如果纹理存储具有特定含义的信息,并且您需要在着色器中获得准确的值(例如,平滑度或金属),请取消选中此框。默认情况下选中此框。

实际在unity 中取消勾选sRGB后图片会变亮,我觉得实际可能是下面这样:(不勾选sRGB的图片会被编码为sRGB格式)

在这里插入图片描述
sRGB只对RGB通道有效,对alpha通道无效

alpha值不参与任何编码gamma、解码gamma的计算,它直接进入shader,被shader读取;

以MetallicSmoothness贴图为例,存储在Alpha通道的Smoothness,本来就是线性的,不论贴图勾不勾选sRGB,都不会影响它,shader能正确读取它的值。

2-5、Gamma和Linear的优缺点

Linear线性色彩空间

Linear线性色彩空间是一种更接近显示光线传播的标识方式,使用线性关系来处理颜色。

在Linerar线性色彩空间中,颜色值的变化更加准确和自然,能够实现更真实世界的光照效果。

Gamma伽马色彩空间

Gamma伽马色彩空间是一种更符合人眼感知的方式,使用非线性关系来处理颜色。

在Gamma伽马色彩空间中,颜色值的变化更加符合人眼的感知特性,能够更好地呈现对比度和亮度等方面的内容。

总结一下

对于需要更真实光照效果的项目,使用Linear线性色彩空间会更合适。默认颜色空间是Gamma伽马色彩空间。

所有需要人眼参与被创作出来的纹理,都应是sRGB(如美术画出来的图)。

所有通过计算机计算出来的纹理(如噪声,Mask,LightMap)都应是Linear。

这很好解释,人眼看东西才需要考虑显示特性和校正的问题。

而对计算机来说不需要,在计算机看来只是普通数据,自然直接选择Linear是最好的。

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

app拉新渠道整合 一手地推、网推拉新平台整理

1.聚量推客 聚量推客自己本身是服务商,自己直营的平台,相对来说数据更好,我们也拿到了平台首码:000000 填这个就行,属于官方渠道 2.蓝猫推客 蓝猫推客我认为是比较又潜力的平台,经过几天测试数据和结算都…

【23级红细胞招新模拟训练(部分题解 不包含最后三题】

前言 提前说明 : 本人是蒟蒻 题解基本没考虑过优化 只求通过 写这篇题解仅仅是分享一下我的做法 使用的语言:cpp 6-1 题目 请编写函数,对三个整数按升序排序。 函数原型 void IntSortAsc3(int *x, int *y, int *z); 说明:参数 …

【鸿蒙软件开发】文本输入(TextInput/TextArea)

文章目录 前言一、输入框1.1 创建输入框单行输入框多行输入框单行和多行输入框的区别 1.2 设置输入框的类型有哪些类型基本输入模式(默认类型)密码输入模式 1.3 自定义样式设置无输入时的提示文本设置输入框当前的文本内容。添加backgroundColor改变输入…

基于减法平均优化的BP神经网络(分类应用) - 附代码

基于减法平均优化的BP神经网络(分类应用) - 附代码 文章目录 基于减法平均优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.减法平均优化BP神经网络3.1 BP神经网络参数设置3.2 减法平均算法应用 4.测试结果…

二叉树的各类实现判断

如何判断一颗二叉树是否是搜索二叉树? 搜索二叉树 每个子树头节点的左孩子比它小,右孩子比它大 经典的搜索二叉树没有重复的数 判断 将二叉树按照中序遍历,判断是否为升序 1、先将整棵树中序遍历再判断是否升序 //中序遍历public stat…

【STL】priority_queue(优先级队列)详解及仿函数使用(附完整源码)

目录 1. priority_queue介绍和使用1.1 priority_queue介绍1.2 priority_queue使用 2. 仿函数介绍3. priority_queue模拟实现 1. priority_queue介绍和使用 1.1 priority_queue介绍 优先级队列也是在<queue>里&#xff1a; 因此和queue一样&#xff0c;priority_queue也…

java头歌-java中的异常

文章目录 第一关第二关第三关第四关 第一关 第二关 题目要求&#xff1a; public static void main(String[] args) {Scanner sc new Scanner(System.in);try {int num1 sc.nextInt();int num2 sc.nextInt();/********* Begin *********/System.out.println(num1/num2);}…

基于stm32控制的4G模块在设备模式下通讯

这里的32控制其实和51的控制思路都是一样的&#xff0c;都是先利用一个网络助手将家里的无线网生成局域网&#xff0c;接着通过花生壳软件将局域网变成公共网&#xff0c;最后是利用串口助手&#xff0c;在4G模块的AT指令模式写入命令ATSOCKTCPC,公共网IP地址,公共网端口号&…

对话销售易CEO史彦泽:中国SaaS企业,利润和现金流从何而来?

导读&#xff1a;SaaS企业如何快速转身&#xff0c;活下来 “华为应改变思路和经营方针&#xff0c;从追求规模转向追求利润和现金流&#xff0c;保证渡过未来三年的危机。把活下来作为最主要纲领&#xff0c;边缘业务全线收缩和关闭&#xff0c;把寒气传递给每个人。” 2022年…

Pinia入门

1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 &#xff0c;是 Vuex 状态管理工具的替代品 2. 手动添加Pinia到Vue项目 后面在实际开发Vue医疗项目的时候&#xff0c;Pinia可以在项目创建时自动添加&#xff0c;现在我们初次学习&#xff0c;从零开始&#xff1a; …

Object.getPrototypeOf()

1、作用 获取指定对象的原型&#xff08;内部​​[[Prototype]]​​属性的值&#xff09;&#xff0c;如果没有继承属性&#xff0c;则返回 null function Animal() {}var ani new Animal();console.log(ani);console.log(Object.getPrototypeOf(ani));2、注意 在 ES5 中&a…

Http长连接同一个socket多个请求和响应如何保证一一对应?

HTTP/2引入二进制数据帧和流的概念&#xff0c;其中帧对数据进行顺序标识&#xff0c;如下图所示&#xff0c;这样浏览器收到数据之后&#xff0c;就可以按照序列对数据进行合并&#xff0c;而不会出现合并后数据错乱的情况。同样是因为有了序列&#xff0c;服务器就可以并行的…

视频去噪网络BSVD的实现

前些天写了视频去噪网络BSVD论文的理解&#xff0c;详情请点击这里&#xff0c;这两个星期动手实践了一下&#xff0c;本篇就来记录一下这个模型的实现。 这个网络的独特之处在于&#xff0c;它的训练和推理在实现上有所差别。在训练阶段&#xff0c;其使用了TSM&#xff08;T…

中国象棋棋盘识别

当象棋爱好者在挑战中国象棋残局或者在阅读象棋杀法书籍的时候遇到问题&#xff0c;往往需要通过象棋软件来辅助提示&#xff0c;此时要将该棋局在象棋软件中摆好&#xff0c;软件才能进行分析&#xff0c;为实现自动识别棋局图片&#xff0c;并导出为标准化FEN象棋文件格式&am…

Lec08 Page faults笔记总结

当一个用户应用程序触发了page fault&#xff0c;page fault会使用与Robert教授上节课介绍的相同的trap机制&#xff0c;将程序运行切换到内核&#xff0c;同时也会将出错的地址存放在STVAL寄存器中。 在SCAUSE&#xff08;注&#xff0c;Supervisor cause寄存器&#xff0c;保…

MyBatis-Plus实现逻辑删除[MyBatis-Plus系列] - 492篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 M…

[Spring] SpringBoot2 简介(二)—— 高级配置

目录 一、Conditional 注解 1、SpringBoot 如何获取 Bean 对象 2、SpringBoot 创建 Condition 类 3、切换内置 web 服务器 二、EnableXXX 注解 1、SpringBoot 不能直接获取其他 jar 包/工程中的 Bean 2、原因分析 3、封装 Import 4、Import 注解 5、SpringBoot 自动配…

前端领域的插件式设计

插件&#xff0c;是一个常见的概念。 例如&#xff0c;当我们需要把我们前端代码中的 css 样式提取打包&#xff0c;我们可以用 webpack 的 mini-css-extract-plugin&#xff0c;或者你如果用 rollup 的话&#xff0c;可以选择 rollup-plugin-postcss。 再比如我们可以给 bab…

Python 数组和列表:创建、访问、添加和删除数组元素

Python 没有内置支持数组&#xff0c;但可以使用 Python 列表来代替。 数组 本页将向您展示如何使用列表作为数组&#xff0c;但要在 Python 中使用数组&#xff0c;您需要导入一个库&#xff0c;比如 NumPy 库。数组用于在一个变量中存储多个值&#xff1a; 示例&#xff0…