【光照】[PBR][法线分布]GGX实现方法对比

news/2025/9/29 8:30:07/文章来源:https://www.cnblogs.com/SmalBox/p/19118055

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

GGX的全称与基本概念

GGX的全称‌:Ground Glass X (或 Generalized Trowbridge-Reitz Distribution)

首次提出‌:Walter等人在2007年发表的论文《Microfacet Models for Refraction through Rough Surfaces》中提出

GGX是一种‌法线分布函数‌(Normal Distribution Function, NDF),用于描述微表面模型中微观几何表面法线的概率分布。它是Unity URP中PBR渲染的核心组成部分,替代了传统的Beckmann分布。

GGX的数学原理

核心公式

在Unity URP中,GGX分布的实现基于以下公式:

$D_{GGX}(h)=\frac{α_g2}{π[(n⋅h)2(α_g2−1)+1]2}$

其中:

  • h:半角向量(光线方向与视线方向的中间向量)
  • n:表面法线
  • $α_g$:粗糙度参数($α_g=roughness^2$)

Unity URP中的代码实现

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

hlsl
// GGX/Trowbridge-Reitz分布函数
float D_GGX(float NdotH, float roughness)
{float a = roughness * roughness;  // 粗糙度平方float a2 = a * a;float NdotH2 = NdotH * NdotH;float denom = NdotH2 * (a2 - 1.0) + 1.0;denom = PI * denom * denom;return a2 / max(denom, 0.000001); // 避免除零错误
}

GGX的核心特性

长尾分布特性

  • 相比Beckmann分布,GGX具有更长的"尾巴"
  • 能更好地模拟真实世界的材质高光衰减
  • 产生更自然的反射光晕效果

能量守恒

  • $∫_ΩD_{GGX}(h)(n⋅h)dω=1$
  • 保证了光线能量在反射过程中不会无故增加或减少
  • 是PBR渲染的基础要求

各向同性/各向异性支持

hlsl
// URP中各向异性GGX实现
float D_GGX_Anisotropic(float NdotH, float HdotX, float HdotY, float ax, float ay)
{float denom = HdotX*HdotX/(ax*ax) + HdotY*HdotY/(ay*ay) + NdotH*NdotH;return 1.0 / (PI * ax * ay * denom * denom);
}

GGX与其他分布函数对比

特性 GGX Beckmann Blinn-Phong
真实度 ★★★★☆ ★★★☆☆ ★★☆☆☆
性能开销 ★★☆☆☆ ★★★☆☆ ★☆☆☆☆
长尾表现 优异 中等 较差
移动端支持 良好 一般 优秀
URP默认 仅在SimpleLit中使用

GGX在Unity URP中的实际应用

材质粗糙度映射

hlsl
// 粗糙度处理流程
float perceptualRoughness = PerceptualSmoothnessToPerceptualRoughness(smoothness);
float roughness = PerceptualRoughnessToRoughness(perceptualRoughness);// 应用纹理采样
roughness = roughness * _RoughnessMap.Sample(sampler_MainTex, uv).r;

高光反射计算

hlsl
// BRDF.hlsl中的完整镜面反射计算
half3 BRDF_SpecularGGX(half3 F0, half roughness, half NdotH, half NdotL, half NdotV, half LdotH)
{half D = D_GGX(NdotH, roughness); // GGX法线分布half V = V_SmithGGXCorrelated(NdotL, NdotV, roughness); // 几何衰减half3 F = F_Schlick(LdotH, F0); // 菲涅尔反射return (D * V) * F;
}

环境光反射处理

hlsl
// 环境BRDF计算(使用GGX分布)
half2 envBRDF = tex2D(_BRDFLUT, float2(NdotV, roughness)).rg;
half3 envSpecular = specularColor * envBRDF.x + envBRDF.y;

GGX的视觉表现特点

粗糙材质表现

  • 低粗糙度:锐利的高光反射
  • 中粗糙度:柔和的散射光晕
  • 高粗糙度:均匀的漫反射外观

边缘响应

  • 在材质边缘产生自然的亮度衰减
  • 模拟真实物体的菲涅尔效应

材质连续性

  • 粗糙度参数从0到1变化时表现平滑过渡
  • 避免传统模型的突兀变化

性能优化技巧

近似计算

hlsl
// GGX的移动端近似
float D_GGX_Mobile(float NdotH, float roughness)
{float a = roughness * roughness;float a2 = a * a;float d = NdotH * NdotH * (a2 - 1.0) + 1.0;return a2 / (d * d * PI);
}

预积分技术

  • URP使用预计算的BRDF查找纹理(_BRDFLUT)
  • 将复杂计算转移到预处理阶段

动态降级

hlsl
#if defined(SHADER_API_MOBILE)// 移动端简化版GGX
#else// 完整精度GGX
#endif

GGX分布作为Unity URP中PBR渲染的核心,通过其独特的数学特性和长尾分布,实现了比传统模型更真实的材质表现。虽然计算复杂度略高,但其在视觉质量和物理准确性上的优势使其成为现代实时渲染的标准选择。


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GitHub每日速递 250929】告别手动查资料!这两个开源项目(17.8k+星)让 AI 帮你做深度研究,报告自动生成

原文:https://mp.weixin.qq.com/s/uxRt8xAdWX59n3RkoDJ5Vg AI + 搜索引擎 = 无敌研究助手?这个开源项目让深度调研效率翻倍项目概述 Open Deep Research 是一个基于 AI 的研究助手,通过结合搜索引擎、网页抓取和大型…

企业门户网站开发背景韩国小游戏网站

不好意思,我要放大招了! 在今天的杭州云栖大会上,阿里巴巴首次公布人工智能调用规模: 每天调用超 1万亿 次 服务全球 10亿 人 日处理图像 10亿 张 视频 120万 小时 语音 55万 小时 自然语言 5千亿 句 在AI芯片、AI云服务、AI算…

订单模块

首先,订单模块是家政项目的 “核心枢纽”—— 它衔接了用户端(下单需求)、服务端(服务信息)、支付模块(资金流转)和优惠券模块(权益核销),核心目标是管理订单从创建到完成 / 取消的全生命周期,确保流程合规…

网站数据库是什么dz网站模板

在Spring框架中,TransactionSynchronizationManager扮演着事务同步管理的核心角色,它不仅负责跟踪当前活动事务的状态,还提供了在事务生命周期中注册回调方法的能力,使得开发者能够在事务开始、提交、回滚等关键时刻执行自定义逻辑…

PS中如何让文字中两行文字实现左对齐且中间部分文字对齐

背景 见图片:如果仅靠添加空格很难实现,我当时就是空格空格对齐(结果被T了) ============================================================================================== 前面的两个还好,因为前面文字一样…

通王网站内容管理系统安徽建站系统

继续梳理以太网的DMA描述符。 以太网DAM描述符的结构 有两种结构,链式结构和环形结构。 常用的是链式结构。 标准库中,关于DMA描述符的数据结构 以gd32f4xx_enet.c为例。 先说发送描述符。 系统分配了5个发送描述符。每个描述符对应的缓冲区大小为152…

手写MyBatis第78弹:装饰器模式在MyBatis二级缓存中的应用:从LRU到防击穿的全方案实现 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

前端获取接口材料流程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Lucene 8.7.0 版本中dvd、dvm文件详解 - 教程

Lucene 8.7.0 版本中dvd、dvm文件详解 - 教程2025-09-29 08:12 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

APEX实战第5篇:利用APEX程序直观体验向量近似检索能力

APEX实战第5篇:利用APEX程序直观体验向量近似检索能力2025-09-29 08:14 AlfredZhao 阅读(0) 评论(0) 收藏 举报在圈内朋友看来,Oracle 数据库的 多模能力 已经不是什么新鲜话题。它不仅在关系型数据管理方面独树…

告别复制粘贴!Chat2File-DeepSeek 让 DeepSeek 对话成果直接变“成品” - 指南

告别复制粘贴!Chat2File-DeepSeek 让 DeepSeek 对话成果直接变“成品” - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

详解 PHP 中的命名空间 Namespace 与 PSR4 自动加载

详解 PHP 中的命名空间 Namespace 与 PSR4 自动加载 随着 PHP 项目规模增长,文件管理和类加载问题逐渐凸显:散乱的目录结构、频繁的 require_once 调用、难以维护的类依赖关系。本文通过 namespace 和自动加载技术,…

html5购物网站模板艾佳工业设计

动态调用的作用 类似于其他语言的反射能够开发框架性代码 Call调用语法 (bool success, bytes data) <address>.call(bytes calldata)call是address的方法call返回值(bool success, bytes data)忽视返回值success&#xff0c;会造成严重问题 calldata的结构 call的…

构建易受攻击的AWS DevOps环境:CloudGoat场景实践

本文详细介绍如何在CloudGoat中构建易受攻击的AWS DevOps环境,包含完整的攻击路径分析,从初始权限提升到供应链安全漏洞利用,展示了真实的云安全测试场景。构建易受攻击的AWS DevOps环境作为CloudGoat场景 CloudGoa…

摩尔线程88天过会,过会当天提交注册:看懂这3个关键,才算懂国产GPU的“生存逻辑”

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087摩尔线程88天冲刺上市:看懂这3个关键,才算懂国产GPU的“生存逻辑…

2025最新四面刨厂家权威推荐排行榜:四面刨厂家实力品牌测评,含定制,高速,重型四面刨优选指南

四面刨作为竹木加工的核心设备,其精度与稳定性直接决定产品合格率与生产效率。当前市场中,既有深耕多年的老牌企业,也涌现出一批技术创新的新锐品牌,但同时存在设备精度参差、定制能力不足、售后响应滞后等问题 —…

Java之泛型使用教程

下面我将为你编写一个使用泛型类的示例代码,这个示例实现了一个通用的"配对"(Pair)类,可以存储两个相同或不同类型的值,并提供基本的操作方法。 这个示例展示了泛型类的几个重要特性:多类型参数:Pair…

单调栈优化DP [ROI 2018] Decryption

题意 要求把一个序列划分成很多段,要求对于每段,最大值是末项,最小值是首项。 求最小划分段数。 解法 我们贪心来思考,若我们要保证一直到 i 是合法的,左端点显然是越往左越好,但是在全局上是并没有这个性质的,…

上海住宅新规调整,背后的野心可大了

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087各位,看到这份文本了吗 添加图片注释,不超过 140 字(可选)没看…

手工调整pip whl 文件内容

手工调整pip whl 文件内容属于一个比较常见的问题,比如我们希望自己修改一个whl 文件的内容,但是还是通过pip install 的模式,不希望通过pip 安装之后再手工进行文件替换,解决方法比较简单 有源码的 可以自己重新构…