找回密码
 立即注册
首页 业界区 业界 【光照】Unity中的[经验模型]

【光照】Unity中的[经验模型]

姜删懔 2025-10-1 17:41:00
【从UnityURP开始探索游戏渲染】专栏-直达
图形学第一定律:“看起来对就对”
URP光照模型发展史


  • 2018年‌:URP首次发布(原LWRP),继承传统前向渲染的Blinn-Phong简化版
  • 2019年‌:URP 7.x引入Basic Shader的简化光照模型
  • 2020年‌:URP 10.x整合PBR核心(GGX+Smith)
  • 2022年‌:URP 14.x新增Screen Space Global Illumination (SSGI)
核心原理架构

URP的经验光照模型基于‌能量守恒近似‌和‌艺术家友好设计‌原则,通过数学简化实现实时渲染效率。其核心公式体系包含:
光能分布模型‌:

$L_o = L_d + L_s + L_a$
$L_d = k_d * (N·L) * I$
$L_s = k_s * (N·H)^n * I$
$L_a = k_a * I_a$

  • $L_d$:兰伯特漫反射(Lambert)
  • $L_s$:Blinn-Phong镜面反射
  • $L_a$:环境光分量
微表面近似‌:

URP的SimpleLit使用改进的Blinn-Phong模型:
  1. hlsl
  2. float spec = pow(max(0, dot(N, H)), _Glossiness * 256);
  3. float3 specular = _SpecColor * lightColor * spec;
复制代码
实现Blinn-Phong风格的光照模型


  • 使用URP标准库Lighting.hlsl实现光照计算
  • 包含完整的顶点-片段着色器结构
  • 实现Blinn-Phong风格的光照模型
  • 支持主方向光的漫反射+镜面反射计算
  • SimpleLit.shader
    1. Shader "Custom/SimpleLit"
    2. {
    3.     Properties
    4.     {
    5.         _BaseColor("Color", Color) = (1,1,1,1)
    6.         _SpecColor("Specular", Color) = (0.5,0.5,0.5)
    7.         _Gloss("Glossiness", Range(0,1)) = 0.5
    8.     }
    9.     SubShader
    10.     {
    11.         Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
    12.         HLSLINCLUDE
    13.         #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
    14.         CBUFFER_START(UnityPerMaterial)
    15.         float4 _BaseColor;
    16.         float4 _SpecColor;
    17.         float _Gloss;
    18.         CBUFFER_END
    19.         struct Attributes
    20.         {
    21.             float4 positionOS : POSITION;
    22.             float3 normalOS : NORMAL;
    23.         };
    24.         struct Varyings
    25.         {
    26.             float4 positionCS : SV_POSITION;
    27.             float3 normalWS : TEXCOORD0;
    28.             float3 viewDirWS : TEXCOORD1;
    29.         };
    30.         ENDHLSL
    31.         Pass
    32.         {
    33.             HLSLPROGRAM
    34.             #pragma vertex vert
    35.             #pragma fragment frag
    36.             Varyings vert(Attributes IN)
    37.             {
    38.                 Varyings OUT;
    39.                 OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
    40.                 OUT.normalWS = TransformObjectToWorldNormal(IN.normalOS);
    41.                 OUT.viewDirWS = GetWorldSpaceViewDir(TransformObjectToWorld(IN.positionOS.xyz));
    42.                 return OUT;
    43.             }
    44.             half4 frag(Varyings IN) : SV_Target
    45.             {
    46.                 // 标准化向量
    47.                 float3 N = normalize(IN.normalWS);
    48.                 float3 V = normalize(IN.viewDirWS);
    49.                
    50.                 // 获取主光源
    51.                 Light mainLight = GetMainLight();
    52.                 float3 L = mainLight.direction;
    53.                 float3 H = normalize(L + V);
    54.                
    55.                 // 漫反射计算
    56.                 float NdotL = max(0, dot(N, L));
    57.                 float3 diffuse = _BaseColor.rgb * mainLight.color * NdotL;
    58.                
    59.                 // 镜面反射计算
    60.                 float NdotH = max(0, dot(N, H));
    61.                 float spec = pow(NdotH, _Gloss * 256);
    62.                 float3 specular = _SpecColor.rgb * mainLight.color * spec;
    63.                
    64.                 // 组合输出
    65.                 return half4(diffuse + specular, 1);
    66.             }
    67.             ENDHLSL
    68.         }
    69.     }
    70. }
    复制代码
实际应用步骤

创建材质‌:


  • 在Project窗口右键 → Create → Material
  • Shader选择"Example/SimpleLit"
光源配置‌:
  1. csharp
  2. // C#控制光源示例using UnityEngine.Rendering.Universal;
  3. public class LightController : MonoBehaviour {
  4.     public Light2D urpLight;
  5.     void Update() {
  6.         urpLight.intensity = Mathf.PingPong(Time.time, 1.5f);
  7.     }
  8. }
复制代码
高级配置参数‌:
  1. csharp
  2. // URP Asset配置路径
  3. Edit → Project Settings → Graphics → Scriptable Render Pipeline Settings
复制代码
关键参数:


  • Main Light Shadows
  • Additional Lights Count
  • Reflection Probes
性能优化建议


  • 移动平台使用SimpleLit代替Lit
  • 控制Additional Lights数量(建议≤4)
  • 使用Light Layers分层渲染
  • 静态物体启用Baked Global Illumination
最新版URP(2023.2)已支持光线追踪扩展包,可通过Package Manager添加Ray Tracing模块实现混合渲染管线。
核心光照模型实现类

类名功能UniversalForwardRenderer主渲染管线入口Lighting.hlsl包含所有光照计算函数BRDF.hlsl实现PBR核心算法MainLight.hlsl主方向光处理AdditionalLights.hlsl附加点光源/聚光灯URP内置光照模型类型

graph TB    A[URP Shader] --> B[SimpleLit]    A --> C[Lit PBR]    A --> D[Unlit]    B --> E[Blinn-Phong变体]    C --> F[GGX+Smith]URP实现架构

graph LR    A[URP Asset] --> B[ForwardRenderer]    B --> C[Lighting Pass]    C --> D[MainLight.hlsl]    C --> E[AdditionalLights.hlsl]    D --> F[Blinn-Phong计算]    E --> G[逐光源叠加]关键HLSL实现

URP光照计算核心代码路径:
  1. Packages/com.unity.render-pipelines.universal/ShaderLibrary/
  2. ├── Lighting.hlsl         # 光照入口
  3. ├── MainLight.hlsl        # 主方向光处理
  4. ├── AdditionalLights.hlsl # 附加光源
  5. └── BRDF.hlsl            # PBR基础函数
复制代码
URP中快速调用标准光照模型实现

脚本位置


  • URP内置的SimpleLit.shader和Lit.shader(位于Packages/com.unity.render-pipelines.universal/Shaders/)
  • 关键变量:_SpecularIntensity(控制高光强度)和_Smoothness(控制反射模糊度)
核心计算逻辑


  • Lambert漫反射‌:通过dot(worldNormal, worldLightDir)计算基础光照
  • Phong/Blinn-Phong镜面反射‌:其中halfDir为半角向量(normalize(lightDir + viewDir))
    1. hlsl
    2. // Phong模型
    3. float3 specular = pow(max(0, dot(reflectDir, viewDir)), _SpecularIntensity);
    4. // Blinn-Phong模型
    5. float3 specular = pow(max(0, dot(normal, halfDir)), _SpecularIntensity);
    复制代码
‌Lighting.hlsl直接调用以上计算公式-调用入口


  • 在Shader的SurfaceInput.hlsl中定义光照输入结构体InputData
  • 通过UniversalFragmentBlinnPhong函数处理光照,这些都定义在Lighting.hlsl中。
  • 在Lighting.hlsl中有以下经验光照的函数可直接调用

    • LightingLambert
    • LightingSpecular
    • CalculateBlinnPhong
    • UniversalFragmentBlinnPhong

【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册