動態

詳情 返回 返回

【光照】[自發光Emission]以UnityURP為例 - 動態 詳情

【從UnityURP開始探索遊戲渲染】專欄-直達

自發光的基本原理

$Cemissive=Memissive$

自發光是物體表面主動發射光線的現象,在光照模型中通常作為獨立於外部光源的附加項。其核心特點是不受其他光照影響,但可以影響周圍環境。

實現流程

  • 定義發射顏色和強度‌:確定基礎發光顏色和亮度
  • 紋理採樣 可選‌:使用紋理控制發射圖案
  • HDR處理‌:支持高於1.0的亮度值
  • 後期處理集成‌:與Bloom等效果結合
  • 間接光照貢獻 可選‌:影響全局光照

Unity URP中的實現方案

核心實現位置

在URP中,自發光主要在以下文件中實現:

  • Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl
  • Packages/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開始探索遊戲渲染】專欄-直達

(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)

Add a new 評論

Some HTML is okay.