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

【光照】[PBR][几何遮蔽]实现方法对比

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

几何遮蔽的基本流程

几何遮蔽(G)在BRDF中用于模拟微表面间的自阴影和遮蔽效应,其计算流程通常分为三个步骤:

  • 遮蔽项计算‌:光线入射方向的遮挡概率
  • 阴影项计算‌:视线方向的遮挡概率
  • 联合计算‌:将两者结合形成完整的几何函数

主要几何遮蔽模型

1. Cook-Torrance模型

原理‌:

  • 基于V形微槽假设
  • 使用简单的min函数计算遮蔽和阴影

公式‌:

$G_{Cook-Torrance}=min⁡(1,\frac{2(n⋅h)(n⋅v)}{v⋅h},\frac{2(n⋅h)(n⋅l)}{v⋅h})$

特点‌:

  • 计算简单但不够精确
  • 在掠射角表现不佳

2. Smith模型

原理‌:

  • 将几何项分解为独立的遮蔽和阴影项
  • 假设微表面高度服从统计分布

公式‌:

$G_{Smith}=G_1(v)⋅G_1(l)$

Unity URP选择‌:

hlsl
// URP中Smith联合Schlick-GGX实现
float V_SmithGGX(float NdotL, float NdotV, float roughness)
{float a = roughness;float a2 = a * a;float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - a2) + a2);float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - a2) + a2);return 0.5 / max((GGXV + GGXL), 0.000001);
}

选择原因‌:

  • 与GGX法线分布完美匹配
  • 能量守恒性更好
  • 计算效率较高

3. Schlick近似模型

原理‌:

  • 对Smith模型的快速近似
  • 使用有理函数替代复杂计算

公式‌:

$G_{Schlick}(n,v)=\frac{n⋅v}{(n⋅v)(1−k)+k},k=\frac{(α+1)^2}8$

特点‌:

  • 适合移动端等性能受限平台
  • 精度略低于完整Smith模型

4. Kelemen-Szirmay-Kalos模型

原理‌:

  • 基于微表面斜率分布
  • 特别适合各向异性材质

公式‌:

$G_{KSK}=\frac1{1+Λ(v)+Λ(l)}$

应用场景‌:

  • 头发、织物等特殊材质渲染

Unity URP的实现方案

选择方案:Smith-Joint-Schlick-GGX

实现代码‌:

hlsl
// Packages/com.unity.render-pipelines.universal/ShaderLibrary/BRDF.hlsl
float V_SmithJointGGX(float NdotL, float NdotV, float roughness)
{float a2 = roughness * roughness;float lambdaV = NdotL * (NdotV * (1.0 - a2) + a2);float lambdaL = NdotV * (NdotL * (1.0 - a2) + a2);return 0.5 / (lambdaV + lambdaL + 1e-5f);
}

选择原因‌:

  • 物理准确性‌:
    • 与GGX NDF保持数学一致性
    • 满足能量守恒和互易性
  • 视觉质量‌:
    • 在掠射角产生自然的阴影衰减
    • 粗糙材质表现更真实
  • 性能平衡‌:
    • 相比完整Smith模型减少30%计算量
    • 移动端友好(无复杂数学函数)
  • 材质一致性‌:
    • 与金属/粗糙度工作流完美配合
    • 参数响应线性度好

优化技术

  • 预计算部分项‌:

    hlsl
    // 预计算粗糙度平方
    float a2 = roughness * roughness;
    
  • 数值稳定性处理‌:

    hlsl
    // 避免除零错误
    return 0.5 / (lambdaV + lambdaL + 1e-5f);
    
  • 移动端简化版‌:

    hlsl
    #if defined(SHADER_API_MOBILE)float V_SmithMobile(float NdotL, float NdotV, float roughness){float a = roughness;float GGXV = NdotL * (NdotV * (1.0 - a) + a);float GGXL = NdotV * (NdotL * (1.0 - a) + a);return 0.5 / (GGXV + GGXL);}
    #endif
    

各模型性能对比

模型 指令数 特殊函数 移动端适用性 视觉质量
Cook-Torrance 8 ★★★★☆ ★★☆☆☆
Smith完整版 15+ sqrt ★★☆☆☆ ★★★★☆
Smith-Schlick 10 ★★★★☆ ★★★☆☆
URP实现 12 sqrt ★★★☆☆ ★★★★☆
Kelemen 18+ 复杂运算 ★☆☆☆☆ ★★★★★

Unity URP的选择在视觉质量和计算开销之间取得了最佳平衡,特别是考虑到现代GPU的架构特性(SIMD执行),即使包含sqrt运算也不会造成显著性能瓶颈。


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

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

http://www.hskmm.com/?act=detail&tid=22026

相关文章:

  • 完整教程:C++设计模式之结构型模式:适配器模式(Adapter)
  • 网页访问速度很慢,远程仓库调用很慢
  • 深入解析:【项目】Vision Master OpenCV 3.0 版本(预)发行说明
  • 2025木方厂家权威推荐榜:实力工厂与优质供应之选
  • 10 月做题记录
  • LoRa/LoRaWAN技术手册
  • 便宜的 VPS
  • 2025南通宠物医院权威推荐榜:专业诊疗与暖心服务口碑之选
  • 【JavaScript 性能优化实战】第六篇:性能监控与自动化优化 - 指南
  • linux 系统cshrc 资料
  • 2025 年西安品质楼盘住宅推荐排行榜权威发布,精选优质楼盘推荐
  • 某商业银行项目管理建设演进报告 - 指南
  • 题解:P14073 [GESP202509 五级] 数字选取
  • 2025西安新房住宅推荐排行榜发布,房屋品质、周边配套、交通便利性多维度选择指南!
  • 华为造车“内战”!徐直军下场做“启境”,会比余承东五界更强?
  • 余承东的新职位传递了华为重大信息
  • 张雪峰的事儿,大有文章
  • 词(持续更新)语言的边界就是
  • 财务分析怎么做 - 智慧园区
  • Maven的安装与配置
  • 2025包装机厂家推荐榜单出炉:拉伸膜真空包装机,全自动真空包装机,滚动式真空包装机,食品真空包装机,气调包装机公司推荐!
  • 2025年真空机厂家推荐榜:平台式真空封口机,拉伸膜真空覆膜机,全自动拉伸膜真空包装机,滚动连续式真空包装机,双面拉伸真空包装机公司实力甄选指南
  • 【半导体器件 | 笔记】金属氧化物半导体场效应晶体管(MOSFET)
  • 元人文AI场域:在有限与无限的纠缠中走向智慧文明
  • 【半导体器件 | 笔记】双极晶体管(BJT)
  • Luogu P3863 序列 题解 [ 紫 ] [ 分块 ] [ 扫描线 ]
  • [HCTF 2018]WarmUp
  • Day2:Linux文件目录移到拷贝与vim编辑器使用指南
  • 【半导体物理 | 笔记】第八章 半导体表面与MIS结构
  • 【半导体物理 | 笔记】第七章 金属和半导体的接触