当前位置: 首页 > web >正文

【光照】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_ENDstruct Attributes{float4 positionOS : POSITION;float3 normalOS : NORMAL;};struct Varyings{float4 positionCS : SV_POSITION;float3 normalWS : TEXCOORD0;float3 viewDirWS : TEXCOORD1;};ENDHLSLPass{HLSLPROGRAM#pragma vertex vert#pragma fragment fragVaryings 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开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

http://www.xdnf.cn/news/19820.html

相关文章:

  • 零工考勤不准、发薪扯皮?盖雅方案让每份工时都清晰可信
  • Web3兴起:重新定义互联网格局
  • 51c大模型~合集177
  • 对象存储 - 同步数据
  • 分布式爬虫的全局请求间隔协调与IP轮换策略
  • 开发(1)获取用户登录IP
  • 信息安全各类加密算法解析
  • 【C++】14. 多态
  • uniapp H5预览图片组件
  • 在VS Code中直接操控浏览器
  • CodeForge v25.0.3 发布:Web 技术栈全覆盖,编辑器个性化定制新时代
  • USB4与PCIe的技术融合:新一代接口协议的架构革新
  • 【论文阅读】Neuro-Symbolic Integration Brings Causal and Reliable Reasoning Proofs
  • 【报错记录】OpenGauss/磐维数据库连接报:org.postgresql.util.PSQLException: 致命错误: 账户被锁定
  • 分公司、工厂、出差人员远程访问办公系统,如何安全稳定又省钱?
  • HTML第六课:表格展示
  • 腾讯开源WMT2025冠军大模型:拿下30个第一,同类最佳
  • 2025 年普通人还可以期待 NFT 交易市场吗?
  • Meta生成式推荐:重塑万亿级推荐系统
  • FastAPI 介绍及示例开发
  • 深度学习之第五课卷积神经网络 (CNN)如何训练自己的数据集(食物分类)
  • 安装wsl报错0x800701bc
  • mapbox高阶,结合threejs(threebox)添加管道,实现管道流动效果
  • 数据库的锁级别
  • HTML5 简介和基础骨架
  • 快速生成商品图:4款国内免费AI工具盘点
  • 【golang长途旅行第36站】golang操作Redis
  • Vue基础知识-localStorage 与 sessionStorage
  • 华为HCIE认证:三年有效期值不值得?
  • 苹果开发中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么关系以及逻辑?优雅草卓伊凡