当前位置: 首页 > news >正文

对于事件、事件流、事件触发的顺序随便说说

靡吻衙阎伽马校正的定义与原理

伽马校正是对颜色值进行非线性变换的过程,其核心是通过幂函数(γ函数)调整亮度值,使人眼感知更均匀。数学表达式为:输出 = 输入^γ,其中γ=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前需要正确伽马空间

http://www.jsqmd.com/news/454121/

相关文章:

  • 2026年教育行业小程序开发指南:北京定制化服务商深度解析 - 品牌2026
  • C# vs C++ 全局照明渲染性能比试
  • leetcode 36: 是否有效数独
  • C#内嵌汇编代码的讨论
  • 振弦式锚索测力计 安全监测传感器
  • 2026家教机构大比拼,这些家教值得你关注,一对一家教试听课/全托冲刺/全托一对一/全托集训营,家教老师排行 - 品牌推荐师
  • 数据仓库维度建模思维导图—— 基于《The Data Warehouse Toolkit, 3rd Edition》(第三版修订版)
  • 回firelong之C#慢
  • 深度揭秘:量产车型VCU整车管理控制器策略开发
  • 预制混凝土消防水池安装与维护评测:厂商服务能力考察,装配式镀锌钢板水箱/不锈钢水箱,预制混凝土消防水池源头厂家怎么选 - 品牌推荐师
  • [特殊字符] CI/CD 自动化部署流程设计完全指南
  • 2026年衣柜专用板材品牌优选指南 十大企业品牌参考 - 十大品牌榜
  • 正运动技术即将亮相合肥工业自动化展
  • 2026年度国家自然科学基金项目形式审查自查表(下载)
  • 【Golang】——Gin 框架中间件详解:从基础到实战
  • 按需选择,拒绝盲目跟风——手机存储容量的理性取舍
  • 周红伟:腾讯让14亿人来养龙虾,QClaw - 腾讯推出的基于OpenClaw的 - 今日头条
  • Python Tkinter 温度转换器二次开发实践
  • Agent项目实战——Agent框架
  • 2026年3月建筑AI实测白皮书:10款工具,EVAI第一
  • 怎么制作小程序,0门槛搭建企业专属小程序 - 码云数智
  • 2026年寺庙小程序开发指南:数字化赋能宗教场所,北京麦冬科技提供定制解决方案 - 品牌2026
  • 长沙看心理医生指南:真实案例分享与医院推荐
  • 2026年 羊绒面料厂家推荐排行榜,再生羊绒面料,出口外贸面料,高端定制与环保创新实力解析 - 品牌企业推荐师(官方)
  • 学术写作的“分子料理“:书匠策AI如何用算法解构重组降重与原创的边界
  • 2026网络安全新战场:重要性飙升背后,有哪些技术红利?
  • 新零售时代的敏捷供应链:线上线下融合下的货运物流系统设计思路
  • SOC蓄电池双向DC/DC充放电控制Matlab仿真模型探索
  • 华东瓷泳系统门窗优质品牌厂家推荐榜 - 优质品牌商家
  • 分享高中自习室优质公司亲测效果