5.1 PBR基础 BRDF介绍

基于物理的渲染(Physically Based Rendering,PBR)是指使用基于物理原理和微平面理论建模的着色/光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。

一、反射率方程

理论基础放在参考链接里。

直接开始分析公式里各项含义。

二、BRDF项

1. F(i,h):菲涅尔方程(Fresnel Equation)

描述不同的表面角下表面所反射的光线所占的比率。

对于菲涅尔(Fresnel)项,业界方案一般都采用Schlick的Fresnel近似,因为计算成本低廉,而且精度足够:

菲涅尔项的常见模型可以总结如下:

  • Cook-Torrance [1982]
  • Schlick [1994]
  • Gotanta [2014]

2. G(i,o,h):几何函数(Geometry Function)

描述微平面自成阴影的属性,即m = h的未被遮蔽的表面点的百分比。

目前较为常用的是其中最为简单的形式,分离遮蔽阴影(Separable Masking and Shadowing Function)。

该形式将几何项G分为两个独立的部分:光线方向(light)和视线方向(view),并对两者用相同的分布函数来描述。根据这种思想,结合法线分布函数(NDF)与Smith几何阴影函数,于是有了以下新的Smith几何项:

  • Smith-GGX
  • Smith-Beckmann
  • Smith-Schlick
  • Schlick-Beckmann
  • Schlick-GGX

其中UE4的方案是上面列举中的“Schlick-GGX”,即基于Schlick近似,将k映射为

,去匹配GGX Smith方程:

3. D(h):法线分布函数 (Normal Distribution Function)

描述微面元法线分布的概率,即正确朝向的法线的浓度。即具有正确朝向,能够将来自l的光反射到v的表面点的相对于表面面积的浓度。

法线分布函数(Normal Distribution Function, NDF)D的常见模型可以总结如下:

  • Beckmann[1963]
  • Blinn-Phong[1977]
  • GGX [2007] / Trowbridge-Reitz[1975]
  • Generalized-Trowbridge-Reitz(GTR) [2012]
  • Anisotropic Beckmann[2012]
  • Anisotropic GGX [2015]

其中,业界较为主流的法线分布函数是GGX(Trowbridge-Reitz),因为具有更好的高光长尾:

4.分母 4(n·l)(n·v):校正因子(correctionfactor)

作为微观几何的局部空间和整个宏观表面的局部空间之间变换的微平面量的校正。

三、Disney Principled BRDF的着色模型

核心BRDF 模型

核心BRDF模型方面,Disney采用了通用的microfacet Cook-Torrance BRDF着色模型:

漫反射项(Diffuse):Disney Diffuse

Disney使用了Schlick Fresnel近似,并修改掠射逆反射(grazing retroreflection response)以达到其特定值由粗糙度值确定,而不是简单为0。

Disney Diffuse漫反射模型的公式为:

其中,

以下为上述Disney Diffuse的Shader实现代码:

// [Burley 2012, "Physically-Based Shading at Disney"]
float3 Diffuse_Burley_Disney( float3 DiffuseColor, float Roughness, float NoV, float NoL, float VoH )
{
	float FD90 = 0.5 + 2 * VoH * VoH * Roughness;
	float FdV = 1 + (FD90 - 1) * Pow5( 1 - NoV );
	float FdL = 1 + (FD90 - 1) * Pow5( 1 - NoL );
	return DiffuseColor * ( (1 / PI) * FdV * FdL );
}

菲涅尔项(Specular F):Schlick Fresnel

菲涅尔项(Specular F)方面,Disney表示Schlick Fresnel近似已经足够精确,且比完整的菲涅尔方程简单得多; 而由于其他因素,Schlick Fresne近似引入的误差明显小于其他因素产生的误差。Schlick Fresnel 近似公式如下:

其中:

  • 常数F0表示垂直入射时的镜面反射率。
  • θd为半矢量h和视线矢量v之间的夹角

以下为Schlick Fresnel的Shader实现代码:

// [Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering"]
float3 F_Schlick(float HdotV, float3 F0)
{
    return F0 + (1 - F0) * pow(1 - HdotV , 5.0);
}

另外,Disney在SIGGRAPH 2015上对此项进行了修订,提出在介质间相对IOR接近1时,Schlick近似误差较大,这时可以直接用精确的菲涅尔方程:

几何项(Specular G):Smith-GGX

几何项(Specular G)方面,对于主镜面波瓣(primary specular lobe),Disney参考了 Walter的近似方法,使用Smith GGX导出的G项,并将粗糙度参数进行重映射以减少光泽表面的极端增益,即将α 从[0, 1]重映射到[0.5, 1],α的值为(0.5 + roughness/2)^2。从而使几何项的粗糙度变化更加平滑,更便于美术人员的使用。

以下为Smith GGX的几何项的表达式:

另外,对于对清漆层进行处理的次级波瓣(secondary lobe),Disney没有使用Smith G推导,而是直接使用固定粗糙度为0.25的GGX的 G项,便可以得到合理且很好的视觉效果。

几何项的Shader实现代码如下:

/法线分布项(Specular D):GTR

可以发现,上式中:
● γ=1时,GTR即Berry分布
● γ=2时,GTR即Trowbridge-Reitz分布
以下为各种γ值的GTR分布曲线与θh的关系图示:
另外,Disney Principled BRDF中使用了两个固定的镜面反射波瓣(specular lobe),且都使用GTR模型,可以总结如下:
● 主波瓣(primary lobe)
  ○ 使用γ= 2的GTR(即GGX分布)
  ○ 代表基础底层材质(Base Material)的反射
  ○ 可为各项异性(anisotropic) 或各项同性(isotropic)的金属或非金属
● 次级波瓣(secondary lobe)
  ○ 使用γ= 1的GTR(即Berry分布)
  ○ 代表基础材质上的清漆层(ClearCoat Layer)的反射
  ○ 一般为各项同性(isotropic)的非金属材质,即清漆层(ClearCoat Layer)
以下是γ= 1和γ= 2时GTR分布的Shader实现代码:
// Generalized-Trowbridge-Reitz distribution
float D_GTR1(float alpha, float dotNH)
{
    float a2 = alpha * alpha;
    float cos2th = dotNH * dotNH;
    float den = (1.0 + (a2 - 1.0) * cos2th);

    return (a2 - 1.0) / (PI * log(a2) * den);
}

float D_GTR2(float alpha, float dotNH)
{
    float a2 = alpha * alpha;
    float cos2th = dotNH * dotNH;
    float den = (1.0 + (a2 - 1.0) * cos2th);

    return a2 / (PI * den * den);
}
以及各项异性的版本:
float D_GTR2_aniso(float dotHX, float dotHY, float dotNH, float ax, float ay)
{
    float deno = dotHX * dotHX / (ax * ax) + dotHY * dotHY / (ay * ay) + dotNH * dotNH;
    return 1.0 / (PI * ax * ay * deno * deno);
}/ Geometric Shadowing function 
float G_SchlickSmithGGX(float NdotL, float NdotV, float roughness)
{
    float r = (roughness + 1.0);
    float k = (r*r) / 8.0;
    float GL = NdotL / (NdotL * (1.0 - k) + k);
    float GV = NdotV / (NdotV * (1.0 - k) + k);
    return GL * GV;
}

// Smith GGX G项,各项同性版本
float smithG_GGX(float NdotV, float alphaG)
{
    float a = alphaG * alphaG;
    float b = NdotV * NdotV;
    return 1 / (NdotV + sqrt(a + b - a * b));
}

// Smith GGX G项,各项异性版本
// Derived G function for GGX
float smithG_GGX_aniso(float dotVN, float dotVX, float dotVY, float ax, float ay)
{
	return 1.0 / (dotVN + sqrt(pow(dotVX * ax, 2.0) + pow(dotVY * ay, 2.0) + pow(dotVN, 2.0)));
}

法线分布项(Specular D):GTR

可以发现,上式中:

  • γ=1时,GTR即Berry分布
  • γ=2时,GTR即Trowbridge-Reitz分布

以下为各种γ值的GTR分布曲线与θh的关系图示:

另外,Disney Principled BRDF中使用了两个固定的镜面反射波瓣(specular lobe),且都使用GTR模型,可以总结如下:

  • 主波瓣(primary lobe)
    • 使用γ= 2的GTR(即GGX分布)
    • 代表基础底层材质(Base Material)的反射
    • 可为各项异性(anisotropic) 或各项同性(isotropic)的金属或非金属
  • 次级波瓣(secondary lobe)
    • 使用γ= 1的GTR(即Berry分布)
    • 代表基础材质上的清漆层(ClearCoat Layer)的反射
    • 一般为各项同性(isotropic)的非金属材质,即清漆层(ClearCoat Layer)

以下是γ= 1和γ= 2时GTR分布的Shader实现代码:

// Generalized-Trowbridge-Reitz distribution
float D_GTR1(float alpha, float dotNH)
{
    float a2 = alpha * alpha;
    float cos2th = dotNH * dotNH;
    float den = (1.0 + (a2 - 1.0) * cos2th);

    return (a2 - 1.0) / (PI * log(a2) * den);
}

float D_GTR2(float alpha, float dotNH)
{
    float a2 = alpha * alpha;
    float cos2th = dotNH * dotNH;
    float den = (1.0 + (a2 - 1.0) * cos2th);

    return a2 / (PI * den * den);
}

以及各项异性的版本:

float D_GTR2_aniso(float dotHX, float dotHY, float dotNH, float ax, float ay)
{
    float deno = dotHX * dotHX / (ax * ax) + dotHY * dotHY / (ay * ay) + dotNH * dotNH;
    return 1.0 / (PI * ax * ay * deno * deno);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是steam搬砖中的散户、倒爷和倒狗?三者有什么区别?

csgo倒狗们是如何操盘csgo饰品市场的? 什么是游戏搬砖中的散户、倒爷和倒狗?三者有什么区别? csgo饰品市场有三种人:散户,倒爷和倒狗。 散户:定义和股票市场中的定义是一样的,拥有同类型饰品数…

STM32入门笔记15_PWR电源管理模块

PWR和低功耗模式 PWR简介 PWR(Power Control) 电源控制PWR负责管理STM32内部的电源供电部分,可以实现可编程电压检测器和低功耗模式的功能可编程电压检测器(PVD) 可以监控VDD电源电压,当VDD下降到PVD阈值以下或上升到PVD阈值之上时,PVD会触…

ESP32测试DHT11温湿度

ESP32测试DHT11温湿度 arduino导入dht库 2.arduion里 DHT11 代码 #include <DHT.h> #define DHTPIN 4 //修改数据引脚 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() {Serial.begin(9600);dht.begin(); }void loop() { float h dht.readHum…

使用Git bash切换Gitee、GitHub多个Git账号

Git是分布式代码管理工具&#xff0c;使用命令行的方式提交commit、revert回滚代码。这里介绍使用Git bash软件来切换Gitee、GitHub账号。     假设在gitee.com上的邮箱是alicefoxmail.com 、用户名为alice&#xff1b;在github上的邮箱是bobfoxmail.com、用户名为bob。 账号…

iframe内部子页面与外部主页面通讯

文章目录 一、问题二、解决2.1、子页面2.2、主页面 三、知识点3.1、[浏览器兼容性](https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%85%BC%E5%AE%B9%E6%80%A7)3.2、详解3.2.1、发送方3.2.2、接收方 一、问题 如上所示&a…

Spring Boot 整合MyBatis-Plus 详解

MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 全新的 MyBatis-Plus 3.0 版本基于 JDK8&#xff0c;提供了 lambda 形…

【附代码】判断线段是否相交算法(Python,C++)

【附代码】判断线段是否相交算法&#xff08;Python&#xff0c;C&#xff09; 文章目录 【附代码】判断线段是否相交算法&#xff08;Python&#xff0c;C&#xff09;相关文献测试电脑配置基础向量旋转向量缩放向量投影推导 点乘定义推导几何意义 叉乘定义推导几何意义 判断线…

Java架构师发展方向和历程

目录 1 导论2 架构师的三观培养3 架构师的遇到的困难4 架构师职责5 架构师之路6 架构师的发展方向7 应用领域架构师8 业务架构师9 系统架构师和企业架构师10 技术路线和演进规划11 一线大厂的技术生态拓张案例12 如何推进项目落地想学习架构师构建流程请跳转:Java架构师系统架…

ARCore:在Android上构建令人惊叹的增强现实体验

ARCore&#xff1a;在Android上构建令人惊叹的增强现实体验 一、 AR 介绍1.1 AR技术简介1.2 AR技术原理1.3 AR技术应用领域 二、Google的增强现实平台ARCore2.1 ARCore简介2.2 ARCore API介绍2.3 ARCore API使用示例 三、总结 一、 AR 介绍 增强现实 Augmented Reality&#x…

芯能科技-603105 三季报分析(20231123)

芯能科技-603105 基本情况 公司名称&#xff1a;浙江芯能光伏科技股份有限公司 A股简称&#xff1a;芯能科技 成立日期&#xff1a;2008-07-09 上市日期&#xff1a;2018-07-09 所属行业&#xff1a;电气机械和器材制造业 周期性&#xff1a;1 主营业务&#xff1a;分布式光伏解…

【LeetCode刷题笔记】DFSBFS(二)

994. 腐烂的橘子(树/图的BFS问题) 解题思路: 多源BFS ,首选找到 所有的腐烂的橘子 ,放入队列中,然后进行 BFS 广搜,广搜的 层数 - 1 就是所需要花费的分钟数。 在最开始先扫描一遍二维数组,将所有的 腐烂的橘子 加入 队列 ,同时统计新鲜橘子的数量 <

Django DRF序列化器serializer

以下案例由浅到深&#xff0c;逐步深入&#xff0c;通过实例介绍了序列化器的使用方法&#xff0c;和遇到的常见问题的解决方法。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…

Banana Pi [BPi-R3-Mini] 回顾和主线 ImmortalWrt 固件支持

BananaPi BPi-R3 Mini 采用 MediaTek 830&#xff08;4 个 A53&#xff0c;最高 2.0 GHz&#xff09;&#xff0c;具有 2 个 2.5 GbE、AX4200 2.4G/5G 无线和 USB 2.0 端口。它还具有两个 M.2 连接器&#xff0c;可用于 NVMe SSD 和 5G 模块&#xff08;板上包含 Nano SIM 插槽…

基于.net framework4.0框架下winform项目实现寄宿式web api

首先Nuget中下载包&#xff1a;Microsoft.AspNet.WebApi.SelfHost&#xff0c;如下&#xff1a; 注意版本哦&#xff0c;最高版本只能4.0.30506能用。 1.配置路由 public static class WebApiConfig{public static void Register(this HttpSelfHostConfiguration config){// …

MDK AC5和AC6是什么?在KEIL5中添加和选择ARMCC版本

前言 看视频有UP主提到“AC5”“AC6”这样的词&#xff0c;一开始有些不理解&#xff0c;原来他说的是ARMCC版本。 keil自带的是ARMCC5&#xff0c;由于ARMCC5已经停止维护了&#xff0c;很多开发者会选择ARMCC6。 在维护公司“成年往事”项目可能就会遇到新KEIL旧版本编译器…

NSGA-II求解微电网多目标优化调度(MATLAB)

一、NSGA-II简介 NSGA-Ⅱ算法是Kalyanmoy Deb等人于 2002年在 NSGA 的基础上提出的&#xff0c;它比 NSGA算法更加优越&#xff1a;它采用了快速非支配排序算法&#xff0c;计算复杂度比 NSGA 大大的降低&#xff1b;采用了拥挤度和拥挤度比较算子&#xff0c;代替了需要指定的…

第十五届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组(详细分析解答)

目录 1.动态的Tab栏 1.1 题目要求 1.2 题目分析 1.3 源代码 2.地球环游 2.1 题目要求 2.2 题目分析 2.3 源代码 3.迷惑的this 3.1 题目要求 3.2 题目分析 3.3 源代码 4.魔法失灵了 4.1 题目要求 4.2 题目分析 4.3 源代码 5.燃烧你的卡路里 5.1 题目要求 5.2…

西门子(Siemens)仿真PLC启动报错处理

目录 一、背景&#xff1a; 二、卸载软件 三、安装软件 三、启动软件 四、下载PORTAL项目 五、测试 一、背景&#xff1a; 在启动S7-PLCSIM Advanced V3.0仿真PLC时报错&#xff0c;报错信息为&#xff1a;>>Siemens PLCSIM Virtual Switch<<is misconfigu…

基于C#实现Prim算法

图论在数据结构中是非常有趣而复杂的&#xff0c;作为 Web 码农的我&#xff0c;在实际开发中一直没有找到它的使用场景&#xff0c;不像树那样的频繁使用&#xff0c;不过还是准备仔细的把图论全部过一遍。 一、最小生成树 图中有一个好玩的东西叫做生成树&#xff0c;就是用…

Redis并发问题解决方案

目录 前言 1.分布式锁 1.基于单个节点 2.基于多个节点 3.watch(乐观锁) 2.原子操作 1.单命令操作 2.Lua 脚本(多命令操作) 3.事务 1.执行步骤 2.错误处理 3.崩溃处理 总结 前言 在多个客户端并发访问Redis的时候&#xff0c;虽然Redis是单线程执行指令&#xff…