5.1 PBR基础 BRDF介绍

news2024/9/26 1:25:00

基于物理的渲染(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);
}

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

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

相关文章

登陆页面模板

简单好看的登陆页面 vue项目代码 可忽略js部分 先来个效果图 <template><div class"login"><div class"content"><p >账户密码登录</p><div class"unit"><label class"label">用户名</…

Vocoder,声码器详解——语音信号处理学习(十)

参考文献&#xff1a; [1] Vocoder (由助教許博竣同學講授)哔哩哔哩bilibili [2] Oord A, Dieleman S, Zen H, et al. Wavenet: A generative model for raw audio[J]. arXiv preprint arXiv:1609.03499, 2016. [3] https://deepmind.com/blog/article/wavenet-generative-mode…

【数据结构/C++】线性表_双链表基本操作

#include <iostream> using namespace std; typedef int ElemType; // 3. 双链表 typedef struct DNode {ElemType data;struct DNode *prior, *next; } DNode, *DLinkList; // 初始化带头结点 bool InitDNodeList(DLinkList &L) {L (DNode *)malloc(sizeof(DNode))…

Flutter 父子组件通信

在Flutter 中父组件调用子组件的方法可以通过GlobalKey实现&#xff0c;而子组件调用父组件方法可以通过回调函数实现。 父组件 class _MyHomePageState extends State<MyHomePage> {final GlobalKey<LoadPencilState> loadPencilKey GlobalKey<LoadPencilSt…

千梦网创:创业,一场游戏一场梦

创业这件事就好比一场养成类游戏&#xff0c;而我们自己就是游戏主角。 这个游戏有一个特殊之处在于&#xff1a;SSS级装备有穿戴等级设定&#xff0c;就算你氪重金买到了一把神器&#xff0c;自身阅历不够也根本无法发挥它的强大威力而只能当个装饰。 这就要求我们真正沉浸在…

react中虚拟dom,diff,fiber - 初级了解

借鉴&#xff1a; 「React深入」一文吃透虚拟DOM和diff算法 - 掘金 (juejin.cn) 虚拟dom、fiber、渲染dom、dom-diff - 掘金 (juejin.cn) 未阅读源码&#xff0c;了解层面&#xff0c;后续可以深入了解 1.虚拟DOM ①.结构上&#xff1a;虚拟DOM比真实DOM轻很多 ②.操作上&…

每日汇评:黄金测试2000美元水平遭到拒绝,为下跌留下了空间

黄金在心理关键的2000美元水平失去了上升动力&#xff1b; 美元指数上涨持续&#xff0c;同时国债收益率反弹&#xff0c;都对黄金价格的上涨构成压力&#xff1b; 美国即将迎来感恩节假期&#xff0c;意味着明天和周五流动性较低&#xff1b; 黄金价格继续在每盎司2000美元以上…

Android二维码扫描开源库 - BGAQRCode-Android

目录 ● 功能介绍 ● 常见问题 ● 效果图与示例 apk ● Gradle 依赖 ● 布局文件 ● 自定义属性说明 ● 接口说明 ● 下载源码 功能介绍 根据之前公司的产品需求&#xff0c;参考 barcodescanner 改的&#xff0c;希望能帮助到有生成二维码、扫描二维码、识别图片二维码等需求…

centos7上用docker部署redis

1. 下载redis镜像 docker pull redis docker images # 查看镜像是否下载成功2. 安装redis容器 2.1 先准备好配置文件redis.conf vi /data/redis/redis.conf写入配置信息&#xff0c;appendonly yes&#xff0c;如果需要给redis配置密码&#xff0c;可以写入requirepass root…

DDoS攻击和CC攻击有什么不同之处?

DDoS是针对服务器IP发起&#xff0c;CC攻击针对的是业务端口。DDoS攻击打的是网站的服务器&#xff0c;而CC攻击是针对网站的页面攻击&#xff0c;用术语来说就是&#xff0c;一个是WEB网络层拒绝服务攻击&#xff08;DDoS&#xff09;&#xff0c;一个是WEB应用层拒绝服务攻击…

C语言从入门到实战——数组和指针的强化练习题

数组和指针的强化练习题 前言1. sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析2.1 一维数组2.2 字符数组2.3 二维数组 3. 指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目23.3 题目33.4 题目43.5 题目53.6 题目63.7 题目7 前言…

玩具礼品经营配送小程序商城作用是什么

玩具礼品所覆盖的需求人群年龄阶层非常广&#xff0c;尤其是孩子们乃至年轻人比较喜欢的&#xff0c;也因此无论线下还是线上都不缺各种店铺&#xff0c;传统商家主要以自然流量和线上开广告、一堆图文等方式分享获得生意。 然而如今随着互联网电商冲击&#xff0c;线下店铺流…

【数据结构】一题带你出师链表!

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 题目链接 138. 随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/ 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机…

PowerDesigner异构数据库转换

主要流程:sql->pdm->cdm->other pdm->sql 1.根据sql生成pdm 2.根据pdm生成cdm 3.生成其他类型数据库pdm

4.3 实时阴影

一、基于图像的阴影技术&#xff08;Shadow Map&#xff09; 什么是阴影 当来自光源的至少一个点在空间中被遮挡时&#xff0c;就产生了阴影区域。 阴影的前提 直接光照不透明物体 阴影的实现方式 阴影体&#xff08;Shadow Volumes&#xff09;——空间中黑暗部分的几何…

【办公常识_1】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

1688API如何获取商品详情信息(关键词搜索商品列表),1688API接口开发系列

1688商品详情接口是指1688平台提供的API接口&#xff0c;用于获取商品详情信息。通过该接口&#xff0c;您可以获取到商品的详细信息&#xff0c;包括商品标题、价格、库存、描述、图片等。 要使用1688商品详情接口&#xff0c;您需要先申请1688的API权限&#xff0c;并获取ac…

Harmony Ble蓝牙App(二)连接与发现服务

Ble蓝牙App&#xff08;二&#xff09;连接与发现服务 前言正文一、BlePeripheral回调二、连接和断连三、连接状态回调四、发现服务五、服务提供者六、显示服务七、源码 前言 在上一篇中我们进行扫描设备的处理&#xff0c;本文中进行连接和发现服务的数据处理&#xff0c;运行…

多线程,线程池,线程的创建,线程池的参数

文章目录 多线程-1 高并发〇、使用多线程的场景1. 为什么使用多线程 1. 线程概述1.1 线程和进程1.2 并发和并行1.3 多线程的优势1.4 程序运行原理1.5 主线程 1.6 线程的 6 种状态2. 线程的创建和启动2.1 Thread类2.2创建线程有哪几种方法2.2.1 继承**Thread**类&#xff0c;重写…

一、用户管理

一、后端数据库初始化 1.1 因为版本问题&#xff0c;始终报错&#xff0c;按照报错信息去查询解决方案&#xff0c;无法解决 灵机一动&#xff1a; 网址&#xff1a; Spring Boot 3.0 升级 实战踩坑记录 - 掘金 (juejin.cn) &#xff11;.&#xff12; 个人配置【运行成功…