【從UnityURP開始探索遊戲渲染】專欄-直達
自發光的基本原理
$Cemissive=Memissive$
自發光是物體表面主動發射光線的現象,在光照模型中通常作為獨立於外部光源的附加項。其核心特點是不受其他光照影響,但可以影響周圍環境。
實現流程
- 定義發射顏色和強度:確定基礎發光顏色和亮度
- 紋理採樣 可選:使用紋理控制發射圖案
- HDR處理:支持高於1.0的亮度值
- 後期處理集成:與Bloom等效果結合
- 間接光照貢獻 可選:影響全局光照
Unity URP中的實現方案
核心實現位置
在URP中,自發光主要在以下文件中實現:
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlslPackages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl
關鍵代碼實現
-
unity_emission_shader
half3 Emission(half3 emissionColor) { #if defined(_EMISSION) return emissionColor * _EmissionColor.rgb * _EmissionStrength; #else return 0; #endif } -
Lighting.hlsl 部分示意
half3 CalculateFinalColor( InputData inputData, SurfaceData surfaceData) { // 基礎光照計算 half3 color = ApplyLighting(inputData, surfaceData); // 添加自發光 color += surfaceData.emission; return color; }
實現特點
材質屬性配置:
_EmissionColor: 發光顏色(RGB)_EmissionMap: 發光紋理(可選)_EmissionStrength: 強度乘數
HDR支持:
- 通過FrameBuffer的HDR格式支持高亮度值
- 與Post-processing Stack的Bloom效果協同工作
全局光照集成:
- 通過Light Probe Proxy Volume影響動態物體
- 參與Reflection Probe的反射計算
性能優化:
- 使用
#if defined(_EMISSION)編譯分支 - 無發光材質自動跳過相關計算
URP選擇此方案的原因
藝術家友好:
- 直觀的顏色和強度參數
- 紋理支持實現複雜發光圖案
物理合理性:
- 正確的能量守恆處理
- HDR範圍符合真實世界亮度
性能平衡:
- 輕量級實現不影響基礎渲染性能
- 與URP的輕量級設計理念一致
擴展性:
- 容易與後期效果集成
- 支持自定義着色器變體
跨平台一致性:
- 在移動端和高端PC上表現一致
- 自動適配不同渲染管線配置
在URP中,自發光實現既保持了足夠的表現力,又維持了輕量級的計算開銷,特別適合移動平台和需要大量發光物體的應用場景。
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)