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

【从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的经验光照模型基于‌能量守恒近似‌和‌艺术家友好设计‌原则,通过数学简化实现实时渲染效率。其核心公式体系包含:

光能分布模型‌:

Lo=Ld+Ls+La

L_d=k_d*(N\cdot L)*I

L_s=k_s*(N\cdot H)^n*I

L_a=k_a*I_a

  • L_d:兰伯特漫反射(Lambert)
  • L_s​:Blinn-Phong镜面反射
  • L_a​:环境光分量

微表面近似‌:

URP的SimpleLit使用改进的Blinn-Phong模型:

hlsl
float spec = pow(max(0, dot(N, H)), _Glossiness * 256);
float3 specular = _SpecColor * lightColor * spec;

实现Blinn-Phong风格的光照模型

  • 使用URP标准库Lighting.hlsl实现光照计算

  • 包含完整的顶点-片段着色器结构

  • 实现Blinn-Phong风格的光照模型

  • 支持主方向光的漫反射+镜面反射计算

  • SimpleLit.shader

    Shader "Custom/SimpleLit"
    {
        Properties
        {
            _BaseColor("Color", Color) = (1,1,1,1)
            _SpecColor("Specular", Color) = (0.5,0.5,0.5)
            _Gloss("Glossiness", Range(0,1)) = 0.5
        }
    
        SubShader
        {
            Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
    
            HLSLINCLUDE
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
    
            CBUFFER_START(UnityPerMaterial)
            float4 _BaseColor;
            float4 _SpecColor;
            float _Gloss;
            CBUFFER_END
    
            struct Attributes
            {
                float4 positionOS : POSITION;
                float3 normalOS : NORMAL;
            };
    
            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float3 normalWS : TEXCOORD0;
                float3 viewDirWS : TEXCOORD1;
            };
            ENDHLSL
    
            Pass
            {
                HLSLPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                Varyings vert(Attributes IN)
                {
                    Varyings OUT;
                    OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
                    OUT.normalWS = TransformObjectToWorldNormal(IN.normalOS);
                    OUT.viewDirWS = GetWorldSpaceViewDir(TransformObjectToWorld(IN.positionOS.xyz));
                    return OUT;
                }
    
                half4 frag(Varyings IN) : SV_Target
                {
                    // 标准化向量
                    float3 N = normalize(IN.normalWS);
                    float3 V = normalize(IN.viewDirWS);
                    
                    // 获取主光源
                    Light mainLight = GetMainLight();
                    float3 L = mainLight.direction;
                    float3 H = normalize(L + V);
                    
                    // 漫反射计算
                    float NdotL = max(0, dot(N, L));
                    float3 diffuse = _BaseColor.rgb * mainLight.color * NdotL;
                    
                    // 镜面反射计算
                    float NdotH = max(0, dot(N, H));
                    float spec = pow(NdotH, _Gloss * 256);
                    float3 specular = _SpecColor.rgb * mainLight.color * spec;
                    
                    // 组合输出
                    return half4(diffuse + specular, 1);
                }
                ENDHLSL
            }
        }
    }
    

实际应用步骤

创建材质‌:

  • 在Project窗口右键 → Create → Material
  • Shader选择"Example/SimpleLit"

光源配置‌:

csharp
// C#控制光源示例using UnityEngine.Rendering.Universal;

public class LightController : MonoBehaviour {
    public Light2D urpLight;
    void Update() {
        urpLight.intensity = Mathf.PingPong(Time.time, 1.5f);
    }
}

高级配置参数‌:

csharp
// URP Asset配置路径
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内置光照模型类型

URP实现架构

关键HLSL实现

URP光照计算核心代码路径:

Packages/com.unity.render-pipelines.universal/ShaderLibrary/
├── Lighting.hlsl         # 光照入口
├── MainLight.hlsl        # 主方向光处理
├── AdditionalLights.hlsl # 附加光源
└── BRDF.hlsl            # PBR基础函数

URP中快速调用标准光照模型实现

脚本位置

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

核心计算逻辑

  • Lambert漫反射‌:通过dot(worldNormal, worldLightDir)计算基础光照

  • Phong/Blinn-Phong镜面反射‌:其中halfDir为半角向量(normalize(lightDir + viewDir)

    hlsl
    // Phong模型
    float3 specular = pow(max(0, dot(reflectDir, viewDir)), _SpecularIntensity);
    // Blinn-Phong模型
    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开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

标题基于SpringBoot的高校餐饮档口管理系统设计与实现AI更换标题第1章引言介绍高校餐饮档口管理系统的研究背景、意义、国内外现状及论文方法与创新点。1.1研究背景与意义阐述高校餐饮档口管理现状及系统开发的重要性。1.2国内外研究现状分析国内外高校餐饮管理系统的研究与应用进展。1.3研究方法及创新点概述本文采用的研究方法及系统设计的创新之处。第2章相关理论总结与高校餐饮档口管理系统相关的现有理论。2.1SpringBoot框架理论阐述SpringBoot框架的原理、优势及其在Web开发中的应用。2.2数据库设计理论介绍数据库设计的基本原则、方法和步骤。2.3系统安全理论讨论系统安全设计的重要性及常见安全措施。第3章系统需求分析对高校餐饮档口管理系统的功能需求、性能需求等进行详细分析。3.1功能需求分析列举系统需实现的主要功能,如档口管理、订单处理等。3.2性能需求分析分析系统对响应时间、并发处理能力等性能指标的要求。3.3非功能需求分析阐述系统对易用性、可维护性等非功能方面的需求。第4章系统设计详细描述高校餐饮档口管理系统的设计过程。4.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的设计。4.2模块设计详细介绍各个功能模块的设计,如用户管理、档口信息管理等。4.3数据库设计阐述数据库表结构的设计、数据关系及索引优化等。第5章系统实现与测试介绍高校餐饮档口管理系统的实现过程及测试方法。5.1系统实现系统各模块的具体实现过程,包括代码编写和调试。5.2系统测试方法介绍系统测试的方法、测试用例设计及测试环境搭建。5.3系统测试结果与分析从功能、性能等方面对系统测试结果进行详细分析。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括高校餐饮档口管理系统的设计与实现成果。6.2展望指出系统存在的不足及未来改进和扩展的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡海水

感谢支持 共同进步 好运++

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值