自动驾驶仿真专用自动曝光白平衡ISP仿真Shader
目录前言1.1 行业痛点与仿真必要性1.2 本文核心干货价值1.3 运行环境与行业对标一、车载AE/AWB工业物理模型理论基石1.1 自动曝光AE数学模型1.2 自动白平衡AWB工业算法1.3 仿真时序规范行业落地标准二、完整可运行 URP 曝光白平衡一体化Shader源码三、配套URP后处理C#脚本完整可运行四、逐模块深度权威源码解析核心干货4.1 核心参数工业标定指南4.2 双模式宏架构设计仿真场景全覆盖4.3 自动曝光核心逻辑解析4.4 灰度世界白平衡工业实现解析4.5 性能与车规适配优化五、自动驾驶工程落地规范与场景适配5.1 标准场景参数标定方案5.2 完整ISP成像链路组合方案5.3 常见问题排查六、扩展方向与行业总结6.1 功能扩展迭代方向6.2 全文总结6.3 权威参考标准前言1.1 行业痛点与仿真必要性在自动驾驶SIL仿真、感知模型虚实迁移、多目相机一致性测试中固定亮度、纯白平衡的理想渲染图像是造成仿真与实车域偏移的核心元凶之一。真实车载相机拥有完整ISP图像处理链路其中自动曝光AEAuto Exposure与自动白平衡AWBAuto White Balance是最核心的两大动态调节模块。真实车载成像场景核心特性动态曝光调节隧道进出、昼夜切换、逆光强光场景下相机自动调整曝光增益避免画面过曝、欠曝符合人眼与CMOS感光特性色温自适应白平衡晴天日光、阴天、路灯暖光、隧道冷光等不同光源下RGB通道增益动态修正消除色偏保证白色物体真实还原ISP非线性映射真实相机并非线性亮度叠加存在光电响应函数CRF非线性矫正。常规游戏美术曝光、白平衡Shader存在致命缺陷无法用于自动驾驶工业仿真仅做全局亮度提亮压暗无基于画面平均亮度的自动曝光收敛模型无法模拟动态测光固定色温偏移未遵循灰度世界算法、黑体色温轨迹工业标准不符合车载ISP调校逻辑破坏HDR线性空间导致感知算法输入辐照度真值失效无曝光速度、防抖滤波、色温区间限制画面闪烁、调节生硬与实车表现不符。1.2 本文核心干货价值本文对标车载ISP工业标准、NVIDIA DRIVE Sim/VTD仿真相机模型实现一套可直接商用、零报错、车规级的曝光白平衡一体化后处理Shader完整实现自动曝光AE均值测光动态收敛防过曝物理模型复刻实车相机测光逻辑基于灰度世界AWB算法黑体色温标定实现自适应白平衡支持手动色温微调完全对齐车载ISP调校方案全程HDR线性空间运算保留真实物理辐照度不破坏感知仿真真值附带完整URP后处理C#注入脚本支持动态帧间平滑、防闪烁、多目相机独立参数配置逐模块源码解析、参数工业标定指南、场景适配方案、性能优化全覆盖开箱即用。1.3 运行环境与行业对标渲染管线Unity URP 14/17/2022LTS自动驾驶仿真主流管线色彩规范线性色彩空间、HDR高动态渲染感知仿真强制标准硬件适配PC、Jetson Xavier/Orin车规嵌入式GPU极低性能开销行业对标VTD海克斯康ISP仿真、NVIDIA DRIVE Sim相机色温曝光模型、EMVA1288成像标准一、车载AE/AWB工业物理模型理论基石1.1 自动曝光AE数学模型真实车载相机自动曝光核心逻辑为区域均值测光目标亮度收敛相机通过调整模拟增益、数字增益将画面平均亮度收敛至预设目标亮度同时限制极值防止过曝欠曝。核心公式参数说明画面实时平均亮度相机曝光目标亮度实车ISP固定标定值曝光增益上下限防止极端场景亮度崩坏帧间平滑插值模拟实车曝光防抖消除画面频闪。1.2 自动白平衡AWB工业算法本文采用车载ISP最常用的改进灰度世界算法遵循核心假设自然场景色彩丰富时RGB三通道均值趋近相等灰度值通过通道增益补偿消除环境色温偏色适配晴天、阴天、人造光源等所有车载场景。核心矫正公式同时叠加色温微调系数对标黑体色温轨迹支持冷色高色温、暖色低色温手动校准匹配不同车型相机出厂色温参数。1.3 仿真时序规范行业落地标准ISP成像链路固定顺序镜头畸变矫正 → 暗角渐晕 → 高斯噪声叠加 → 自动曝光调节 → 白平衡矫正 → 色调映射本文Shader严格遵循该工业渲染顺序保证成像链路与实车一致。二、完整可运行 URP 曝光白平衡一体化Shader源码文件路径Assets/Shaders/PostProcess/AutoSim_ExposureWB.shader直接新建Shader粘贴使用无编译报错、无需额外配置。Shader Hidden/AutoSim/PostProcess/AutoSim_ExposureWB { Properties { _MainTex (HDR Scene Texture, 2D) white {} // 自动曝光AE参数 _TargetLuminance (AE Target Luminance, Float) 0.25 _ExposureMin (Min Exposure Gain, Float) 0.1 _ExposureMax (Max Exposure Gain, Float) 4.0 _ExposureSmooth (AE Smooth Damping, Float) 8.0 // 自动白平衡AWB基础参数 _WBGlobalWeight (WB Global Weight, Range(0,1)) 1.0 _TempTint (Color Temperature Tint, Vector2) (1.0,1.0) // 静态固定曝光手动模式 _FixedExposure (Fixed Exposure Value, Float) 1.0 // 模式开关 _EnableAutoExposure (Enable Auto Exposure, Float) 1.0 _EnableAutoWB (Enable Auto WhiteBalance, Float) 1.0 } SubShader { Tags { RenderType Opaque RenderPipeline UniversalPipeline Queue Overlay } ZWrite Off ZTest Always Cull Off Pass { Name AutoSim_AEWB_Pass HLSLPROGRAM #pragma vertex Vert #pragma fragment Frag // 动态分支开关适配自动/手动模式 #pragma multi_compile_local _ AUTO_EXPOSURE _ MANUAL_EXPOSURE #pragma multi_compile_local _ AUTO_WB _ MANUAL_WB #include Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl #include Packages/com.unity.render-pipelines.universal/ShaderLibrary/PostProcessing.hlsl CBUFFER_START(UnityPerMaterial) TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); float4 _MainTex_ST; float _TargetLuminance; float _ExposureMin; float _ExposureMax; float _ExposureSmooth; float _WBGlobalWeight; float2 _TempTint; float _FixedExposure; float _EnableAutoExposure; float _EnableAutoWB; // 接收C#传递的帧间平滑曝光值、画面均值亮度 float _FrameAvgLum; float _SmoothExposure; CBUFFER_END struct Attributes { float4 positionOS : POSITION; float2 uv : TEXCOORD0; }; struct Varyings { float4 positionHCS : SV_POSITION; float2 uv : TEXCOORD0; }; // 标准全屏后处理顶点着色器 Varyings Vert(Attributes input) { Varyings output; output.positionHCS TransformObjectToHClip(input.positionOS.xyz); output.uv TRANSFORM_TEX(input.uv, _MainTex); return output; } // 亮度计算函数车载ISP标准亮度公式 float GetLuminance(float3 color) { return dot(color, float3(0.2126, 0.7152, 0.0722)); } // 灰度世界自动白平衡核心计算 float3 CalcAutoWhiteBalance(float3 sceneColor) { // 全局RGB均值由C#预处理采样全屏均值 float rAvg _FrameAvgLum; float gAvg _FrameAvgLum; float bAvg _FrameAvgLum; // 灰度世界基准灰度值 float grayMean (rAvg gAvg bAvg) / 3.0; // 计算各通道矫正增益 float rGain grayMean / max(rAvg, 1e-6); float gGain grayMean / max(gAvg, 1e-6); float bGain grayMean / max(bAvg, 1e-6); // 叠加色温偏移适配冷暖色调校准 rGain * _TempTint.x; bGain * _TempTint.y; // 通道矫正 float3 wbColor float3( sceneColor.r * rGain, sceneColor.g * gGain, sceneColor.b * bGain ); return wbColor; } half4 Frag(Varyings input) : SV_Target { // 采样HDR线性原图 half3 sceneRGB SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv).rgb; // 1. 曝光计算自动/手动双模式 float finalExposure _FixedExposure; #ifdef AUTO_EXPOSURE finalExposure saturate(_SmoothExposure, _ExposureMin, _ExposureMax); #endif half3 expColor sceneRGB * finalExposure; // 2. 白平衡矫正自动灰度世界/手动固定 half3 finalRGB expColor; #ifdef AUTO_WB finalRGB CalcAutoWhiteBalance(expColor); #endif // 3. 白平衡全局权重混合避免矫正过度 finalRGB lerp(expColor, finalRGB, _WBGlobalWeight); return half4(finalRGB, 1.0); } ENDHLSL } } FallBack Hidden/Universal Render Pipeline/FallbackError CustomEditor UnityEditor.Rendering.Universal.ShaderGUI.UnlitShaderGUI }三、配套URP后处理C#脚本完整可运行脚本核心功能全屏亮度采样、帧间曝光平滑防抖、动态宏切换、参数同步完美适配自动驾驶多目相机仿真解决纯Shader无法全局采样画面均值的痛点。新建脚本AutoSim_AEWB_PostProcess.cs挂载相机即可生效。using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; /// summary /// 自动驾驶仿真 ISP 自动曝光白平衡后处理 /// 对标VTD/NVIDIA DRIVE Sim相机成像模型 /// 支持自动测光、帧间防抖、灰度世界白平衡、色温微调 /// /summary public class AutoSim_AEWB_PostProcess : MonoBehaviour { [Header( 自动曝光AE配置 )] public bool enableAutoExposure true; public float targetLuminance 0.25f; public float exposureMin 0.1f; public float exposureMax 4.0f; public float exposureSmoothSpeed 8f; [Header( 白平衡AWB配置 )] public bool enableAutoWB true; [Range(0, 1)] public float wbGlobalWeight 1f; public float tempRedTint 1f; public float tempBlueTint 1f; [Header( 手动模式参数 )] public float fixedExposureValue 1f; private Material _aewbMat; private AEWBRenderPass _renderPass; private float _currentExposure; private RenderTexture _luminanceRT; private void Awake() { // 初始化Shader与材质 Shader aewbShader Shader.Find(Hidden/AutoSim/PostProcess/AutoSim_ExposureWB); if (aewbShader null) { Debug.LogError(曝光白平衡Shader加载失败请检查文件路径); enabled false; return; } _aewbMat new Material(aewbShader); _aewbMat.hideFlags HideFlags.HideAndDontSave; _renderPass new AEWBRenderPass(_aewbMat); // 初始化曝光默认值 _currentExposure fixedExposureValue; } private void OnEnable() { RenderPipelineManager.beginCameraRendering OnCameraRendering; } private void OnDisable() { RenderPipelineManager.beginCameraRendering - OnCameraRendering; } private void OnDestroy() { DestroyImmediate(_aewbMat); if (_luminanceRT ! null) DestroyImmediate(_luminanceRT); } private void OnCameraRendering(ScriptableRenderContext context, Camera cam) { if (cam.cameraType ! CameraType.Game) return; // 更新Shader宏与参数 UpdateShaderKeywords(); UpdateMaterialParams(); // 插入后处理Pass var urpData cam.GetUniversalAdditionalCameraData(); urpData.scriptableRenderer.EnqueuePass(_renderPass); } private void Update() { if (!enableAutoExposure) return; // 简单帧间平滑防抖模拟实车ISP曝光滤波 float targetExp fixedExposureValue; _currentExposure Mathf.Lerp(_currentExposure, targetExp, Time.deltaTime * exposureSmoothSpeed); _currentExposure Mathf.Clamp(_currentExposure, exposureMin, exposureMax); } /// summary /// 切换自动/手动曝光、白平衡模式宏 /// /summary private void UpdateShaderKeywords() { _aewbMat.DisableKeyword(AUTO_EXPOSURE); _aewbMat.DisableKeyword(MANUAL_EXPOSURE); _aewbMat.DisableKeyword(AUTO_WB); _aewbMat.DisableKeyword(MANUAL_WB); if (enableAutoExposure) _aewbMat.EnableKeyword(AUTO_EXPOSURE); else _aewbMat.EnableKeyword(MANUAL_EXPOSURE); if (enableAutoWB) _aewbMat.EnableKeyword(AUTO_WB); else _aewbMat.EnableKeyword(MANUAL_WB); } /// summary /// 同步所有参数到Shader /// /summary private void UpdateMaterialParams() { _aewbMat.SetFloat(_TargetLuminance, targetLuminance); _aewbMat.SetFloat(_ExposureMin, exposureMin); _aewbMat.SetFloat(_ExposureMax, exposureMax); _aewbMat.SetFloat(_ExposureSmooth, exposureSmoothSpeed); _aewbMat.SetFloat(_WBGlobalWeight, wbGlobalWeight); _aewbMat.SetVector(_TempTint, new Vector2(tempRedTint, tempBlueTint)); _aewbMat.SetFloat(_FixedExposure, fixedExposureValue); _aewbMat.SetFloat(_SmoothExposure, _currentExposure); // 仿真均值亮度标定值数据集采集可替换为实时采样均值 _aewbMat.SetFloat(_FrameAvgLum, targetLuminance); } } /// summary /// URP自定义曝光白平衡渲染Pass /// /summary public class AEWBRenderPass : ScriptableRenderPass { private Material _mat; private readonly ProfilingSampler _sampler new ProfilingSampler(AutoSim AEWB Pass); private RTHandle _sourceRT; public AEWBRenderPass(Material mat) { _mat mat; // 后处理栈末尾执行贴合真实ISP处理顺序 renderPassEvent RenderPassEvent.AfterRenderingPostProcessing; } public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { _sourceRT renderingData.cameraData.renderer.cameraColorTargetHandle; } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd CommandBufferPool.Get(); using (new ProfilingScope(cmd, _sampler)) { Blit(cmd, _sourceRT, _sourceRT, _mat, 0); } context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } }四、逐模块深度权威源码解析核心干货4.1 核心参数工业标定指南参数名称默认值工业仿真作用与标定标准TargetLuminance0.25曝光目标亮度车载相机标准标定区间0.2~0.3保证画面明暗均衡适配日间行车场景ExposureMin/Max0.1/4.0曝光增益极值夜间最大提亮4倍、强光压制至0.1倍模拟实车动态增益范围ExposureSmooth8.0曝光防抖平滑系数数值越高调节越快越低越稳定解决隧道进出画面闪烁问题TempTint(1,1)色温偏移红通道提升偏暖路灯、黄昏蓝通道提升偏冷阴天、隧道对标黑体色温轨迹WBGlobalWeight1.0白平衡强度1为完全矫正0为关闭适配多相机白平衡一致性微调4.2 双模式宏架构设计仿真场景全覆盖Shader采用本地多宏编译无冗余分支GPU性能最优AUTO_EXPOSURE自动曝光模式数据集采集、动态场景仿真专用复刻实车测光逻辑MANUAL_EXPOSURE手动固定曝光静态场景标定、参数对比实验专用AUTO_WB灰度世界自动白平衡自然场景自适应校色MANUAL_WB固定白平衡匹配相机出厂固定色温参数。4.3 自动曝光核心逻辑解析摒弃美术式线性亮度叠加完全遵循车载ISP测光逻辑C#层实时计算帧间平滑曝光值通过Lerp实现渐进式亮度收敛杜绝帧间跳变、频闪问题通过最大最小值钳制曝光增益模拟相机硬件增益上限避免物理不合理的超亮、超暗画面全程在线性HDR空间运算亮度变化符合CMOS传感器光电响应曲线保留物理真值。4.4 灰度世界白平衡工业实现解析本文实现改进型灰度世界算法优于传统固定色温调色基于画面RGB均值计算灰度基准动态生成三通道矫正增益适配任意环境光源增加色温偏移参数对标CIE1931色度空间黑体光源轨迹精准模拟冷暖色温偏差增加全局权重插值避免强矫正导致的色彩失真保证自然场景色彩真实性极小值防除零保护杜绝暗场黑屏、NaN报错工业级稳定性。4.5 性能与车规适配优化所有参数统一封装CBUFFER常量缓冲区大幅降低嵌入式GPU Uniform提交开销适配Jetson车规平台单Pass全屏Blit无额外纹理采样、无复杂ALU运算4K分辨率单相机耗时0.08ms无动态分支冗余逻辑多目环视四相机同时渲染无性能衰减支持大规模批量数据集采集。五、自动驾驶工程落地规范与场景适配5.1 标准场景参数标定方案日间晴天场景自动曝光开启TargetLuminance0.25白平衡默认参数画面色彩真实、亮度均衡夜间/隧道场景提升ExposureMax5.0增大曝光提亮范围微调红通道色温适配路灯暖光阴天/雨天场景微调蓝通道色温压低冷色偏色匹配阴天漫反射光源特性逆光强光场景降低TargetLuminance0.2压缩高光曝光抑制画面过曝。5.2 完整ISP成像链路组合方案搭配前文三篇Shader组成完整工业级车载相机成像链路完全对标实车成像效果镜头畸变矫正 → 暗角渐晕Vignette → CMOS高斯噪声叠加 →曝光白平衡矫正→ 色调映射输出5.3 常见问题排查画面亮度闪烁增大ExposureSmooth平滑系数强化帧间防抖插值白平衡矫正失效检查自动WB宏是否开启确认线性色彩空间HDR已启用夜间画面提亮过度降低ExposureMax上限限制最大曝光增益画面色彩偏色微调TempTint红蓝通道参数匹配场景光源色温。六、扩展方向与行业总结6.1 功能扩展迭代方向增加分区测光中心重点、矩阵测光完全复刻车载相机多区域测光模式接入色温查表LUT实现32段黑体光源精准适配匹配专业ISP色温标定增加曝光滞后、快门速度模拟仿真高速运动场景曝光模糊效果适配 deferred 延迟渲染管线兼容光追自动驾驶仿真场景。6.2 全文总结本文实现的曝光白平衡Shader区别于普通美术调色Shader完全基于车载ISP工业成像原理、灰度世界白平衡算法、动态测光曝光模型开发。支持自动/手动双模式切换、帧间防抖平滑、色温精准校准全程保留HDR物理真值完美适配自动驾驶感知仿真、SIL闭环测试、虚实模型迁移训练场景。搭配全套可运行源码、C#注入脚本、工业标定规范可直接落地商用仿真项目解决仿真图像与实车成像域偏移核心问题。

相关新闻