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

📅 发布时间:2026/7/7 20:45:45 👁️ 浏览次数:
对于事件、事件流、事件触发的顺序随便说说
靡吻衙阎伽马校正的定义与原理伽马校正是对颜色值进行非线性变换的过程其核心是通过幂函数γ函数调整亮度值使人眼感知更均匀。数学表达式为输出 输入^γ其中γ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示例2Unity颜色空间设置csharp// 检查当前颜色空间if (QualitySettings.activeColorSpace ColorSpace.Linear) {// 在线性空间下自动处理伽马校正material.color Color.red;// Unity会自动处理转换}示例3解决PS与Unity混合差异当PSGamma空间与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.shaderShader Custom/GammaCorrection{Properties{_MainTex (Texture, 2D) white {}_GammaValue (Gamma Value, Range(0.1, 3.0)) 2.2}SubShader{Tags { RenderTypeOpaque RenderPipelineUniversalRenderPipeline }Pass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlslstruct 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.csusing 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前需要正确伽马空间