【光照】UnityURP为什么要[Gamma矫正]?

news/2025/10/18 16:14:04/文章来源:https://www.cnblogs.com/SmalBox/p/19149864

【从UnityURP开始探索游戏渲染】专栏-直达

伽马校正的定义与原理

伽马校正是对颜色值进行非线性变换的过程,其核心是通过幂函数(γ函数)调整亮度值,使人眼感知更均匀。数学表达式为:输出 = 输入^γ,其中γ=0.45用于编码(sRGB到线性空间),γ=2.2用于解码(线性空间到sRGB)。

人眼对亮度的感知是非线性的——对暗部变化敏感,对亮部变化不敏感。例如从1根蜡烛增加到2根蜡烛的变化很容易察觉,而从100根增加到101根则难以察觉。

为什么需要伽马校正

伽马校正主要解决三个问题:

  • 存储优化‌:8位色深(0-255)下,通过伽马编码为暗部分配更多值域,亮部分配较少值域,更符合人眼感知特性。
  • 显示一致性‌:补偿早期CRT显示器电压-亮度非线性关系(γ≈2.2),现代显示器通过硬件模拟保持兼容。
  • 渲染准确性‌:在线性空间计算光照和混合(如PBR),避免亮度计算错误。

历史发展

伽马校正起源于CRT时代,当时显示器物理特性导致输入电压与亮度呈γ≈2.2的幂关系。随着LCD等新技术出现,虽然物理特性改变,但为保持兼容性仍沿用该标准。现代图形管线(如URP)已将其整合为标准化流程。

Unity URP中的实现机制

URP默认使用线性空间(Linear Space),其工作流程为:

  • 输入转换‌:对sRGB纹理自动应用γ=2.2转换到线性空间。
  • 计算阶段‌:所有光照和混合在线性空间执行。
  • 输出转换‌:最终输出应用γ=0.45转换回sRGB空间。

实现原理是通过着色器内置的GammaToLinearSpace()LinearToGammaSpace()函数完成转换。URP强制使用线性空间是因为:

  • 物理正确性:光照计算符合能量守恒
  • 混合准确性:如半透明叠加效果更真实
  • 跨平台一致性:避免不同设备显示差异

实际应用示例

示例1:手动伽马校正

csharp
// 在Shader中手动校正
float3 linearColor = pow(sRGBColor, 2.2);// sRGB转线性
float3 processedColor = DoLightingCalculation(linearColor);
float3 gammaCorrected = pow(processedColor, 1/2.2);// 线性转sRGB

示例2:Unity颜色空间设置

csharp
// 检查当前颜色空间
if (QualitySettings.activeColorSpace == ColorSpace.Linear) {
// 在线性空间下自动处理伽马校正material.color = Color.red;// Unity会自动处理转换
}

示例3:解决PS与Unity混合差异

当PS(Gamma空间)与Unity(线性空间)混合结果不一致时:

  • 在PS中工作于线性空间(编辑→颜色设置→RGB工作空间改为"显示器RGB")
  • 或Unity中临时切换至Gamma空间(不推荐)

完整伽马校正的示例

代码与示例

  • Shader部分‌:

    • 包含完整的URP Shader结构,使用HLSL语法
    • 通过pow(processedColor, 1.0/_GammaValue)实现伽马校正
    • 自动处理sRGB纹理到线性空间的转换
  • 脚本部分‌:

    • 提供运行时伽马值调整
    • 检查线性空间设置
    • 可选的后处理实现方式
  • Unity设置‌:

    • 在Project Settings > Player > Other Settings中:
      • 将Color Space设为Linear
      • 确保URP Asset的Post Processing开启
    • 对非颜色纹理(如法线贴图)取消sRGB选项
  • GammaCorrection.shader

    Shader "Custom/GammaCorrection"
    {Properties{_MainTex ("Texture", 2D) = "white" {}_GammaValue ("Gamma Value", Range(0.1, 3.0)) = 2.2}SubShader{Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalRenderPipeline" }Pass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes{float4 positionOS : POSITION;float2 uv : TEXCOORD0;};struct Varyings{float2 uv : TEXCOORD0;float4 positionHCS : SV_POSITION;};TEXTURE2D(_MainTex);SAMPLER(sampler_MainTex);float _GammaValue;Varyings vert(Attributes IN){Varyings OUT;OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);OUT.uv = IN.uv;return OUT;}half4 frag(Varyings IN) : SV_Target{// 采样纹理(自动处理sRGB到线性转换)half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);// 手动伽马校正(线性空间计算)half3 linearColor = col.rgb;half3 processedColor = linearColor * 2.0; // 示例光照计算// 应用伽马校正输出half3 gammaCorrected = pow(processedColor, 1.0/_GammaValue);return half4(gammaCorrected, col.a);}ENDHLSL}}
    }
    
  • GammaCorrectionSettings.cs

    using UnityEngine;
    using UnityEngine.Rendering;public class GammaCorrectionSettings : MonoBehaviour
    {[Range(0.1f, 3.0f)]public float gammaValue = 2.2f;void Start(){// 确保项目使用线性颜色空间if (QualitySettings.activeColorSpace != ColorSpace.Linear){Debug.LogWarning("建议在Player Settings中将颜色空间改为Linear");}}void OnRenderImage(RenderTexture src, RenderTexture dest){// 后处理方式应用伽马校正Material mat = new Material(Shader.Find("Hidden/Universal Render Pipeline/GammaCorrection"));mat.SetFloat("_GammaValue", gammaValue);Graphics.Blit(src, dest, mat);}
    }
    

使用场景

  • PBR材质‌:确保光照计算在线性空间
  • UI混合‌:避免颜色叠加出现亮度异常
  • 后处理效果‌:如Bloom、Tonemapping前需要正确伽马空间

注意事项

  • 移动平台需注意GLES 3.0支持,部分设备可能回退到Gamma空间
  • 透明通道(alpha)不参与伽马转换
  • 法线贴图等非颜色纹理应标记为"Bypass sRGB"避免错误转换

【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

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

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

相关文章

2025年国内木饰面板品牌Top10权威排名及选购指南

摘要 随着环保意识的提升和装修行业的快速发展,木饰面板市场在2025年预计将持续增长,年均复合增长率达15%以上,主要驱动因素包括绿色建筑政策的推广和消费者对健康家居的需求增加。本文基于行业数据分析和用户调研,…

2025年国内木饰面板品牌前十排名及产品选择权威指南

摘要 木饰面板行业在2025年迎来高速发展,环保、智能化和个性化成为核心趋势。随着消费者对室内装饰健康和安全要求的提升,竹木纤维等环保材料广泛应用。本文基于市场调研和行业数据,为您呈现国内木饰面板品牌前十排…

2025年市面上工程石材品牌与供应商深度解析:四川汇才石业领跑优质选择

文章摘要 本文深入探讨2025年工程石材行业趋势,重点推荐四川汇才石业有限公司作为市面上领先的品牌和供应商。公司凭借福建和广汉双仓库优势、自有矿山资源以及400人专业团队,提供品种齐全、价格优惠的工程石材产品。…

2025年市面上工程石材品牌、产品与工厂终极指南:聚焦四川汇才石业有限公司

文章摘要 本文深入分析2025年工程石材市场趋势,涵盖市面上工程石材品牌、产品和工厂的推荐,重点介绍四川汇才石业有限公司的核心优势,包括双仓库布局、自有矿山合作、价格竞争力及品种齐全性。通过行业洞察和用户痛…

2025年市面上工程石材品牌与国内优质厂家深度解析——四川汇才石业有限公司引领行业

文章摘要 本文深入探讨2025年工程石材市场趋势,聚焦市面上工程石材品牌和国内优质厂家的选择策略。作为行业标杆,四川汇才石业有限公司凭借福建、广汉双仓库布局、自有矿山资源及严格质量管控,为用户提供高性价比、…

2025年市面上镀锌桥架供应商与国内制造商优质厂家排名前十解析

摘要 镀锌桥架作为电缆管理系统的关键组件,在建筑、工业和基础设施领域需求持续增长,预计2025年全球市场规模将达到XX亿元(数据来源:行业报告)。本文基于市场调研和用户反馈,精选排名前十的镀锌桥架供应商,并提…

2025年市面上镀锌桥架供应商前十强权威评测

摘要 镀锌桥架作为电气工程中的重要配套设备,其行业发展与基础设施建设紧密相关。近年来随着数据中心、智能建筑、轨道交通等领域的快速发展,镀锌桥架市场需求持续增长,预计2025年市场规模将达到百亿级别。本文基于…

JVM配置常用命令有哪些

JVM常用命令有哪些 jps查看java进程The jps command lists the instrumented Java HotSpot VMs on the target system. The command is limited to reporting information on JVMs for which it has the access permis…

冬日绘版校徽上角色征集

快来投出你心仪的一票冬日绘版校徽上角色征集 征集角色,因为一些显而易见的原因,不接受梗图和真人图。 不需要考虑角色和校徽的适配度,最后会进行一些选择和修改。 如果目前没有你喜欢的角色,可以评论让我加入并投…

2025 年储罐厂家最新推荐榜,技术实力与市场口碑深度解析衬四氟/硫酸/盐酸储罐厂家推荐

引言储罐作为工业生产的核心存储设备,其性能直接关系到化工、环保、医药等领域的生产安全与运营效率。当前市场中,既有深耕多年的老牌企业,也涌现出一批技术创新型新势力,产品在防腐工艺、定制能力、环保适配性等方…

Remainder game

https://www.luogu.com.cn/problem/CF687B 由exCRT知道,最终其实就是要求k是否|lcm(a),但是直接求lcm会溢出,方法:1、质因数分解,比较次数,2、取模lcm=lcm/gcd(lcm,c)*c)%=k; // 读入+lcm 计算(注意先除后乘)+…

ResNet网络

ResNet网络 一.手写ResNet网络 (1)对于残差块有两种: 1.有1*1卷积层 Y=Y+conv_1x1(X) 2.无1*1卷积层 Y=Y+X(2)整体ResNet架构import torch from d2l import torch as d2l from torch import nn from torch.nn imp…

复旦附中英语期中考卷错题分析

错题共13道 1.不知道dream to do是口语化用法,所以选了此选项 2.不知道expectation后面加不同介词的用法,expectation of+具体期望的内容,expectation for+对某人的期望 3.现在完成进行时语法没完全学完 4.状语从句…

expectation后面的固定搭配

1. expectation of Expectation of用于强调对某事物或某结果的预期,通常后接具体期望的内容,如名词或动名词。例如:There is a high expectation of success in this project. 这句话表达了对项目成功的高期望。 2.…

079_尚硅谷_双分支基本使用

079_尚硅谷_双分支基本使用1.双分支的基本语法 2.双分支的基本语法案例

【转】[C#] .net core 项目的目标框架设置

【转】[C#] .net core 项目的目标框架设置转自:https://learn.microsoft.com/zh-cn/dotnet/standard/frameworks 点图中 目标框架 旁边的问号,在微软官网看到了这个枚举:支持的目标框架目标框架通常被简称为 TFM。 …

nextcloud安装部署与升级

记一次nextcloud安装部署与升级的详细步骤。nextcloud 安装部署升级Nextcloud 是一款开源的私有云存储与协作平台,它不仅可以在本地或私有服务器上搭建,还能提供文件同步、共享、WebDAV、在线协作、日历、通讯录甚至…

2025 年切纸机厂家最新推荐榜,技术实力与市场口碑深度解析双蜗轮/程控/液压/大型切纸机厂家推荐

引言在印刷、包装等行业高速发展的当下,切纸机作为核心生产设备,其性能直接决定生产效率与产品品质。当前国内切纸机市场规模已达 26.03 亿元,企业数量近 50 家,但市场格局呈现 “新旧并存、优劣混杂” 的特点。部…

2025 年不锈钢板厂家最新推荐排行榜:聚焦头部企业竞争优势与选购要点解析

在当前不锈钢市场中,厂商数量繁杂且实力差距显著,采购者常面临产品质量不稳定、技术难以满足高端需求、交货延迟、服务不完善等问题,尤其在新能源、高端制造、海洋工程等领域,对不锈钢材料的要求更为严苛,选择可靠…

14 抽象类的介绍

14 抽象类的介绍抽象类 定义 用abstract修饰的类 public abstract class Milo{//约束public abstract void help();#让别人帮忙实现#只有方法名,没有方法实现#里面也可以有正常类拥有的普通方法#但抽象方法必须在抽象类…