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);
}

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

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

相关文章

【uniapp】uniapp开发小程序定制uni-collapse(折叠面板)

需求 最近在做小程序,有一个类似折叠面板的ui控件,效果大概是这样 代码 因为项目使用的是uniapp,所以打算去找uniapp的扩展组件,果然给我找到了这个叫uni-collapse的组件(链接:uni-collapse&#xff09…

超详细的接口测试

本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分&#xf…

ShellCode漏洞

ShellCode漏洞 可以查看如下网址: https://www.cnblogs.com/kakadewo/p/12996878.html 定义: shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制之机械码,以其经常让攻击者获得shell而得名。shellcode常常使用机…

老鸟总结,软件测试工程师职业发展规划路线,入门到冲击大厂...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、测试工程师发展…

YOCTO 下载repo工具失败解决办法

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repocp repo ~/binchmod ax ~/bin/repo如果使用时报错, 切换ubuntu 到 python3 版本。gedit repo 修改repo默认链接地址:REPO_URL "https://gerrit.googlesource.com/git-repo"…

Spring AOP-面向切面编程概念

Spring AOP-面向切面编程概念 AOP(面向切面编程)是编程范式的一种,它允许程序员将横切关注点(cross-cutting concerns)模块化。在面向切面编程中,这些横切关注点通常体现为在多个点重复出现的代码&#xf…

Android设计模式--适配器模式

至诚之道,可以前知 一,定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 适配器模式在我们的开发中使用率极高,ListView,GridView&am…

面试cast:reinterpret_cast/const_cast/static_cast/dynamic_cast

目录 1. cast 2. reinterpret_cast 3. const_cast 3.1 加上const的情况 3.2 去掉const的情况 4. static_cast 4.1 基本类型之间的转换 4.2 void指针转换为任意基本类型的指针 4.3 子类和父类之间的转换 5. dynamic_cast 5.1 RTTI(Run-time Type Identification) 1.…

Selenium实现多页面切换

当使用 Selenium 进行自动化测试或爬取数据时,有时需要处理多个页面之间的切换。以下是一些可能需要多页面切换的情况: 1、打开新窗口/页面: 在当前页面上点击链接、按钮或执行某些操作时,可能会打开一个新的窗口或页面。此时&a…

【element优化经验】怎么让element-ui中表单多语言切换排版不乱

目录 前言: 痛点: 1.左对齐,右对齐在中文和外语情况下字数不同,固定宽度会使名称换行,不在整行对齐,影响美观。 2.如果名称和输入框不在一行,会使页面越来越长 3.label-width值给变量&#…

随笔记录-springmvc_ResourceHandlerRegistry+ResourceHttpRequestHandler

环境:springboot-2.7.5 配置文件配置静态资源映射 springboot配置静态资源映射方式是通过 WebMvcAutoConfiguration 实现的 spring: # resources: # # 自springboot 2.5.5之后,该属性已经被废弃,使用spring.web.resources.static-locat…

爬虫逆向你应该懂得Javascript知识

背景 大家在学习爬虫逆向的时候,一般都会涉及到对js源文件进行代码扣去,但是有的时候,你最好有js基础,能发现加密或者解密在那个位置,或者是能用python改写js代码,这就对个人的Javascript的能力有一定要求…

Switch的使用及其注意事项

注意第五点要看清,case执行完后匹配没有成功,如过有Default,将会执行Default,如果有case在Default之后,而且Default没有break语句,那么将会继续执行case的语句,此时case中的常量表达式只起语句标…

【Skynet 入门实战练习】游戏模块划分 | 基础功能模块 | timer 定时器模块 | logger 日志服务模块

文章目录 游戏模块基础功能模块定时器模块日志模块通用模块 游戏模块 游戏从逻辑方面可以分为下面几个模块: 注册和登录网络协议数据库玩法逻辑其他通用模块 除了逻辑划分,还有几个重要的工具类模块: Excel 配置导表工具GM 指令测试机器人…

系列一、Spring整合MyBatis不忽略mapper接口同目录的xxxMapper.xml

一、概述 默认情况下maven要求我们将xml配置、properties配置等都放在resources目录下,如果我们强行将其放在java目录,即将xxxMapper.xml和xxxMapper接口放在同一个目录下,那么默认情况下maven打包时会将这个xxxMapper.xml文件忽略掉&#xf…

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

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

【标注数据】labelme的安装与使用

这里写目录标题 下载标数据 下载 标数据 打开自动保存 创建矩形

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

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

Design Guidelines for 100 Gbps

文章目录 Stratix V GT Transceiver ChannelsCFP2 Host Connector Assembly and PinoutStratix V GT to CFP2 Interface Layout DesignBoard Stack Up DimensionsExample Design Channel PerformanceSimulation Results for Stratix V GT to CFP2 Connector Layout Design Desi…