news 2026/10/22 12:32:35

【光照】[PBR][漫反射]实现方法对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【光照】[PBR][漫反射]实现方法对比

URP BRDF漫反射方法对比

方法名称 数学公式 特点 性能消耗 适用场景

Lambert $L_d = k_d * max(0, N·L)$ 经典模型,能量不守恒 ★☆☆ 移动端低配

Half-Lambert $L_d = k_d * (0.5*(N·L)+0.5)^2$ 增强暗部细节 ★★☆ 卡通渲染

Disney Diffuse 复杂能量守恒公式 物理准确,计算复杂 ★★★ PC/主机高品质

Burley Diffuse 基于微表面理论 PBR标准,次表面散射近似 ★★★ 金属/粗糙度工作流

具体实现方法及示例

Lambert模型(URP默认)

hlsl

// Lighting.hlsl 中的实现

half3 DiffuseLambert(half3 diffuseColor)

{

return diffuseColor / PI; // 能量归一化

}

// 实际调用示例

half NdotL = saturate(dot(normalWS, light.direction));

half3 lambert = DiffuseLambert(_BaseColor.rgb) * NdotL;

Half-Lambert(Valve改进版)

hlsl

half3 DiffuseHalfLambert(half3 diffuseColor, half NdotL)

{

half wrap = 0.5 * (NdotL + 1.0);

return diffuseColor * wrap * wrap;

}

// 调用示例

half3 halfLambert = DiffuseHalfLambert(_BaseColor.rgb, NdotL);

Disney Diffuse(URP Lit.shader使用)

hlsl

// BRDF.hlsl 中的实现

half3 DiffuseDisney(half3 baseColor, half NdotV, half NdotL, half LdotH, half roughness)

{

half fd90 = 0.5 + 2 * LdotH * LdotH * roughness;

half lightScatter = (1 + (fd90 - 1) * pow(1 - NdotL, 5));

half viewScatter = (1 + (fd90 - 1) * pow(1 - NdotV, 5));

return baseColor * lightScatter * viewScatter / PI;

}

URP实际使用情况

‌默认采用方案‌:

Simple Lit管线:Lambert模型(简化版)

Lit管线:Disney Diffuse + Burley改进(见BRDF.hlsl)

‌核心代码路径‌:

Packages/com.unity.render-pipelines.universal/ShaderLibrary/BRDF.hlsl

→ DirectBDRF()函数

→ DisneyDiffuse()分支

‌性能优化策略‌:

csharp

// URP Asset中可关闭高质量漫反射

UniversalRenderPipelineAsset.asset →

Lighting → UseRoughnessRefraction = false

方法对比

‌视觉差异‌:

Lambert:明暗对比强烈

Half-Lambert:暗部提亮约30%

Disney:边缘光更自然(菲涅尔效应)

‌推荐选择‌:

移动端:Lambert(Simple Lit)

主机/PC:Disney(Lit Shader)

风格化:Half-Lambert(需自定义Shader)

URP 2022 LTS版本中,主流的Lit.shader默认使用改进版Disney模型,通过#define _BRDF_BURLEY宏启用。开发者可通过修改BRDF.hlsl中的#define语句切换不同模型。

除了以上Unity URP中涉及到的基于物理光照模型的漫反射实现方式,还有Oren-Nayar模型来实现漫反射

Oren-Nayar模型原理

‌核心思想‌:

由Michael Oren和Shree Nayar于1994年提出,基于‌微表面自阴影理论‌,适用于粗糙表面(如布料、砂石)。其公式为:

$L = k_d * max(0, N·L) * (A + B * max(0, cos(φ_v-φ_l)) * sin(α) * tan(β))$

$A = 1 - 0.5*(σ²)/(σ²+0.33)$

$B = 0.45*(σ²)/(σ²+0.09)$

$α = max(θ_v, θ_l)$

$β = min(θ_v, θ_l)$

σ:表面粗糙度参数(0°-90°)

φ:方位角

‌视觉特性‌:

粗糙表面边缘亮度增强

逆向光时出现"后向散射"效果

相比Lambert更符合真实布料观测

Unity URP中的使用情况

‌默认未采用原因‌:

‌性能考量‌:需要额外计算角度和粗糙度(比Lambert多30%指令数)

‌艺术控制‌:参数物理意义不如PBR直观

‌光照一致性‌:URP优先保证移动端性能

‌替代方案‌:

简单场景:使用SimpleLit的Lambert

复杂材质:通过LitShader的Smoothness参数间接控制

手动实现方案

若需在URP中使用Oren-Nayar,可修改BRDF.hlsl:

hlsl

// 在BRDF.hlsl中添加

half3 DiffuseOrenNayar(half3 albedo, half roughness, half NdotV, half NdotL, half LdotV)

{

half sigma2 = roughness * roughness;

half A = 1.0 - 0.5 * sigma2 / (sigma2 + 0.33);

half B = 0.45 * sigma2 / (sigma2 + 0.09);

half s = LdotV - NdotL * NdotV;

half t = s > 0 ? 1.0 / max(NdotL, NdotV) : 1.0;

return albedo * (A + B * s * t) * NdotL;

}

适用场景建议

‌推荐使用情况‌:

风格化渲染(如手绘布料)

考古/地质仿真项目

需要特殊边缘光效果的场景

‌性能对比‌:

模型 指令数(移动端) 内存访问

Lambert 12 3

Oren-Nayar 38 5

Disney 45 6

当前URP 2022 LTS版本中,可通过自定义Shader Graph节点实现Oren-Nayar,但官方未内置因其不符合URP的"性能优先"设计原则。实际项目中建议通过法线贴图+Lambert近似替代。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 23:40:24

行业视角下的数据库监控演进:主动预防能力何以成为刚需

凌晨三点的告警电话刺耳地响起,屏幕上一片飘红的性能指标让DBA(数据库管理员)瞬间清醒,又一个不眠之夜在“救火”中开始了——这种场景曾是DBA工作的日常。深夜的“救火”场景,本质是传统被动响应运维模式的真实写照。…

作者头像 李华
网站建设 2026/10/22 13:21:16

​当年靠这个ASP.NET电子书城系统,我的毕业设计直接拿优!(附核心源码)​

谁懂啊!当年做毕业设计时,选了个 “电子书城系统”,没想到不仅完美解决了传统购书的痛点,还靠扎实的技术实现拿了优秀!今天把这份压箱底的开发笔记分享出来,包含技术选型、核心模块实现、踩坑实录,适合.NET 初学者练手,老程序员也能追忆当年的开发情怀~ 一、项目背景…

作者头像 李华
网站建设 2026/10/22 18:14:22

极坐标波束形成数据底跟踪算法详解

极坐标波束形成数据底跟踪算法详解 一、基本概念 1.1 底跟踪的定义 底跟踪(Bottom Tracking)是通过声学回波信号检测和跟踪海底位置的技术,主要用于: 测量船舶相对于海底的速度确定水深辅助水下导航定位补偿多普勒计程仪测量 …

作者头像 李华
网站建设 2026/10/22 19:31:03

【技术教程】TrustFlow 授权策略是怎么实现的?

打开链接即可点亮社区Star,照亮技术的前进之路。 Github 地址:https://github.com/secretflow/trustflow/ TrustFlow提供了一套简洁易懂的语法帮助用户对数据使用行为的授权进行描述。接下来我们会详细描述这套语法,并结合示例进行讲解。 …

作者头像 李华
网站建设 2026/10/23 1:14:15

丐版 OI 技巧 / 杂项部分总结 + 作者学习笔记

持久化区间修改区间查询线段树:SP11470 TTM - To the moon点击查看代码2. 有后效性的 dpCF24D Broken robot一般用高斯消元 求解。也可以多跑几遍朴素 dp 使误差降到可接受范围内。多跑几遍的代码3. P14402 [JOISC 2016] 危险的滑冰 / Dangerous Skating图论建模。思…

作者头像 李华