PBR PartⅠ 原理篇

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/u013746357/article/details/84945226
这篇文章为翻译文章,为避免翻译的文章不在原创列表列里,设置为原创,特此声明

原文地址: https://learnopengl.com/PBR/Theory

原理

PBR, 基于物理的渲染是多种渲染技术的集合,而这些技术一定程度上是基于现实世界物理规律的。因为基于物理的渲染是以一种物理上可信的方式模拟光照,因此相比于传统经验式的方式(Phong and Blinn-Phong)更加真实。而不仅仅是视觉效果上更加真实,艺术家们可以根据一些可测量的真实数据(表面辐照度、光滑度等)来调整表面材质,而不用完全依赖经验反复调整参数,而且这些材质在不同的光照环境下都会有正确的显示,而不需要根据不同的光照条件单独重新调整参数。

基于物理的渲染只是对现实世界的近似(基于一些物理原理),因此称之为基于物理的渲染而不知直接称为物理渲染。对于PBR光照模型来讲,之所以认为是基于物理的是因为满足下 面的三个条件:

1.     基于微表面模型                                                                                                                                                                                                                                               
2.     满足能量守恒
3.     使用基于物理的双面反射分布函数(BRDF) 

这篇教程中的PBR方法最早是由迪士尼开发,并且Epic Games的实时显示中也是采用的同样的方法。他们采用的基于金属工作流的方式有着良好的文档,并且在大部分引擎中得到了应用。文章的最后我们能够制作出下图这样的内容:
在这里插入图片描述

微表面模型

所有PRB技术都基于微表面理论。这个理论认为任何表面在微观尺度上都可以看作微小的完美反射镜面,也就是微表面。不同粗糙程度的表面,对应的微表面会有不同的排列。下图就是对应于粗糙表面和光滑表面的微表面结构:
在这里插入图片描述
这些微表面的排列越混乱,材质表面的粗糙度就会越高。更加粗糙的表面,这些微表面的排列会更加混乱,导致对入射光线的镜面反射方向排列也更加混乱,因此会有更加宽的高光区域。相反的,对于平滑表面,反射光线的方向相对更加接近,产生更加小而强烈的反射:
在这里插入图片描述
在微观尺度上没有表面是绝对平滑的,但是因为这些微表面足够小以至于我们没法在象素尺度上区分这些表面,我们通过统计学的方式,用一个表面粗糙度的参数来近似这些微表面的粗糙程度。根据表面的粗糙程度我们可以计算出这些微表面对齐于某一个向量方向上的比例。例如光照向量 l 和观察向量 v 的中值向量h。
在这里插入图片描述
越多的微表面和这里的中值向量h对齐,就会有更加强烈和清晰的高光反射。使用统计学上近似的微表面对齐参数-表面粗糙度,不同的值可以得出不同的显示效果:
在这里插入图片描述
可以看到,更大的粗糙度值可以得到更加大的高光(镜面反射)区域,相反的,更加平滑的表面会得到更加小而清晰的高光区域。

能量守恒

微表面近似法展示了一种能量守恒的方式:出射光线的能量不能超过入射光线的能量(不包括自发光表面)。前面的图中我们可以看到,随着表面粗超程度的增加,高光区域范围增加的同时表面的亮度对应的开始下降。想象一下,如果随着高光区域的增加,高光强度却保持一致,就需要更多的出射的能量,而这是违反能量守恒定律的。这也就是为什么我们在平滑表面看到更加强的高光反射,而在粗糙表面上会更加暗淡朦胧。

为了保证能量守恒,我们需要明确区分漫射(diffuse)光和镜面反射(specular)光。光线打到材质表面时,分为了两个部分,折射和反射。反射是指那些直接从表面反射出去而没有进入材质内部的光线,也就是我们所谓的镜面反射(specular )光/高光。折射是指剩余的进入材质内部并被吸收或再次从表面反射出去的光线,也就是我们所谓的漫射(diffuse)光。

折射的部分光线并不是在接触到材质表面时就立即被吸收掉。物理上来讲,我们知道光线可以看作一种在能量消失之前保持直行的能量流;通过和物质内部的微粒碰撞可以使光线的能量消失。如下图,这些物质内部的微粒通过多次碰撞吸收部分或者全部的光线的能量,并转化为热能。
在这里插入图片描述

通常来讲,光线和微粒碰撞时,并不是所有的能量都被一次吸收掉,光线会散射到一个随机的方向时,直到经过多次碰撞能量耗尽或者再次从材质表面离开。重新从表面产生的光线构成了材质的观察颜色(漫射)。基于物理的渲染中,我们为了简化模型,假定所有折射的光线在一个和对应的入射光线所在的非常小的区域内被吸收和散射(同一个像素范围内),忽略掉那些在稍微远的区域从表面出射的光线。考虑这些从比较远的地方出射的光线的着色技术叫做次表面散射技术,这一技术可以明显的提高一些材质例如皮肤、大理石或者蜡的视觉质量,同时也会有更大的开销。

当考虑金属表面的反射和折射的时候会有一点不同。金属表面相比于非金属表面(也叫做绝缘材质)对光线的响应不同。金属表面使用同样的反射折射理论,但是所有的折射的光线都被吸收而不会再次散射出表面,只留下高光反射部分,金属表面没有漫射颜色(diffuse color)。因为金属和非金属表面的这个明显不同,在PBR管线中也做了不同的处理。

反射和折射光线的不同也给我们另外一个角度来看待能量守恒:这两种光线是互斥的。也就是说,反射的部分的光线能量就不能被材质吸收。因此,能够被用来计算进入材质内部的折射光的能量是我们计算过反射光线之后剩余部分的能量。

为了保证这个能量守恒的关系,我们先计算入射光线中镜面反射的部分,另外一部分的折射光线可以直接从镜面反射部分计算得出(折射比例= 1-镜面反射比例):
在这里插入图片描述
使用这种反射和折射分开的办法,可以保证漫射(refracted/difuse)和镜面反射(reflected/specular)的和不会超过1,也就确保了他们的能量的总和不会超过入射光线的能量,而这是我们以前的传统方式不会考虑的。

The reflectance equation

反射方程

我们这里讨论下大家所谓的渲染方程,渲染方程是目前我们用来模拟光线可视化的最好的模型。基于物理的渲染就是使用的基于该渲染方程的一个更加专一化的版本-反射方程。为了更好的理解PBR,我们要先理解反射方程:
在这里插入图片描述
反射方程初看之下非常复杂,随着我们的深入分析,你会发现它的意义所在。为了理解这个方程,我们先探究下辐射测量技术(radiometry)。辐射测量技术是用来测算电磁辐射的(包括可见光)。有多个用来测算表面光照和方向的物理量,但是我们这里只讨论和反射方程相关的一个物理量-辐射率(radiance),这里用符号L表示。辐射率用来量化单一方向光源的量级或强度。辐射率理解起来会比较棘手,因为它是多个物理量的集合。

辐射通量(Radiant flux):辐射通量Φ 是用来表示光源传输的能量(以瓦特为单位)。光是多个不同波长的能量的组合,每一个波长对应一个颜色。因此光源发射的能量可以看作所有不同波长的一个函数。390nm到700nm之间的波长被认为是可见光谱,也就是人眼可识别的波长。下图是日光中,不同波长的部分所占的能量。
在这里插入图片描述
辐射通量测算这个不同波长的函数的总和。在图形学中直接使用这些波长的测算结果作为输入基本上不现实,因此我们直接用光照颜色(编码为RGB)作为辐射通量来进行简化,而不是使用不同波长强度的函数。尽管这种编码方式损失了很多信息,但是这些损失的信息在视觉上来讲是可以忽略不记的。

立体角:立体角用符号ω来表示,代表一个形状在一个单位球体上的投影的尺寸或区域。可以把立体角想象为一个带有体积的方向。
在这里插入图片描述
辐射强度:辐射强度用来表示单位立体角的辐射通量的数量。例如一个全方向的光源(点光源),辐射强度是指,在单位区域内(单位立体角)通过的能量。
在这里插入图片描述
定义辐射强度的方程如下:
在这里插入图片描述
这方程中辐射强度(I)是指单位面积(立体角ω)上通过的光的能量总和(光通量Φ)。
使用辐射通量,辐射强度和立体角,我们就可以描述最终的辐射方程:辐射强度为Φ的的光源在立体角ω的情况下对区域A的总观测能量
在这里插入图片描述
在这里插入图片描述
辐射率作为辐射度测量方法,和入射光线与表面法线的夹角的余弦成比例。垂直照射表面时,辐射强度最强,之后角度越大辐射强度越小。而夹角的余弦对应于两个向量的点乘结果(需要归一化)。

float cosTheta = dot(lightDir, N);

辐射率方程非常有用,因为它由许多我们关心物理量构成。如果我们认为这里的立体角ω 和区域A无限小,我们可以使用辐射率方程来估算单一光线在空间中单一点的辐射量。这一关系使得我们可以计算单一光线在在一个单一点(片元)上的辐射率,我们把立体角ω 转换为一个方向向量ω ,把区域A转换为点p。这样我们就可以直接使用在我们的shader里使用辐照率来计算单一光线对每个片元贡献。
事实上,当讨论辐射率的时候,我们通常关心点p处的所有入射光线,也就是所有辐射率(radiance)的和:辐照度(irradiance)。有了辐射率和辐照度的概念,我们再去看我们的反射方程:
在这里插入图片描述
我们现在知道渲染方程中的Li代表点p处无限小的立体角ωi的辐射率。这里立体角ωiωi可以看作一个入射方向向量。 还有前面提及的cosθ,cos⁡θ 代表光线的入射方向和表面的夹角,在反射方程中用n⋅ωi来表示。反射方程Lo(p,ωo)计算点p处从ωo的角度观察的反射的辐射之和 。
因为反射方程是基于辐射度(所有入射光线的辐射),我们计算的不是单一光源而是半球Ω内的所有入射光源方向。这个半球是指对齐于表面法线的半球。
在这里插入图片描述
我们使用半球内所有入射方向 dωi 的积分 ∫ 来计算半球内的所有值。为了简化积分的计算,我们把半球分为有限个离散的小块,我们计算半球内这小有限个离散小块的反射方程的和并且根据步数对这个累计和求平均值。这个过程就是我们所知的黎曼和(Riemann sum),我们用代码表示如下:

int steps = 100;
float sum = 0.0f;
vec3 P = ...;
vec3 Wo = ...;
vec3 N = ...;
float dW = 1.0f / steps;
for(int i = 0; i < steps; ++i)
{
vec3 Wi = getNextIncomingLightDir(i);
sum += Fr(P, Wi, Wo) * L(P, Wi) * dot(N, Wi) * dW;
}

通过调整步长dW,这里的和就等于整个区域的积分函数。这里的步长dW可以看作是反射方程中的dωi。数学上来讲dωi是一个计算积分的连续的符号,和代码里的步长dW并不直接相关(代码里是是黎曼和的一个离散的步长)。使用离散的步长将给我们一个上述方程的近似。通过增加步数可以获得更精确的结果。这里的入射光线,可以来自于光源,也可以来自于环境贴图。我们会在之后的IBL的教程里讲到如何使用环境贴图。

现在方程中剩下的未知的部分式fr 这个符号,fr就是我们说的BRDF(双面反射分布函数),用来根据表面材质属性计算出射光线的强度。

BRDF 双面反射分布函数

BRDF是一个使用入射光线方向ωi、出射光线方向 ωo、表面法线n和表面粗糙度a做为输入的函数。BRDF计算非透明表面入射光线ωi 对最终的反射光的贡献度。例如,如果表面是一个完美的平滑面,BRDF方程会对入射光线ωi的反射方向和出射方向(wo)一致辐射,返回1.0,其他所有的光线都返回0。只有镜面反射,没有漫反射。
BRDF 基于前面讨论的微表面理论近似计算材质的反射和折射部分。对于一个物理上可信的BRDF,必须遵守能量守恒,反射光线的和不能超过入射光的和。技术上来讲,Blinn-Phong可以认为是使用同样的ωi和ωo的BRDF函数。然而,Blinn-Phong因为不满足能量守恒,所以不能看作是PBR渲染。
有多个基于物理的BRDF函数,但是几乎所有的实时渲染管线都使用称作Cook-Torrance BRDF 的技术
Cook-Torance BRDF 包含漫射和镜面反射的计算部分:
在这里插入图片描述
这里的kd和ks,就是前面提到的入射光线的折射和反射的比例。flambert是漫射部分的函数,称之为兰伯特漫射,是一个常量因子:
在这里插入图片描述

这里的c是反射率或者表面颜色。这里除以pi是为了归一化漫射光,因为前面提到的反射函数中包含BRDF的积分中乘过了一次pi,所以这里要除以pi。(我们会在IBL的教程中再次解释)。

你可能会疑惑这里的兰伯特漫射和常见的使用表面颜色乘以光源方向和表面法线的夹角的计算方式之间的有什么关系。实时上这里的点乘依然存在,只是从BRDF里提取到了外边,即前面的反射方程最后的n⋅ωi。

有多种漫射方程可以用到BRDF里计算漫射的部分,有些看起来会更加真实,但是也会需要更多的计算开销。根据Epic Games的结论,兰伯特漫射对大部分实时渲染来讲已经足够了。
BRDF的镜面反射部分看起来更加高级:
在这里插入图片描述
Cook-Torrance 镜面反射 BRDF由三个函数DFG和分母上的归一化因子构成。这里的DFG分别代表对表面反射属性的三个不同的部分的近似。分别是:法线分布(Distribution)函数D,菲涅尔(Fresnel)方程F和几何(Geometry)函数G。

  • 法线分布函数D:通过表面粗糙度属性,近似计算对齐于半角向量(halfway vector ,h)的微表面的数量;这是近似模拟微表面的主要方程。
  • 几何函数G:描述微表面的自遮挡属性。当表面相对粗糙时,会有部分微表面遮挡到其他表面,从而降低反射的光线的数量。
  • 菲涅尔方程F:菲涅尔方程描述在不同的角度下反射的比例。

上述每一个方程都是对物理的模拟,你会发现每个方程都有不止一个版本,一些更加真实,一些更加高效。可以选择这些函数的不同的近似版本来使用。Epic Games 的Brian Karis 对这些不同的方法做了研究,我们这里使用Epic Games 的UE4引擎一样的函数来介绍,分别是 D:Trowbridge-Reitz GGX ;F:Fresnel-Schlick approximation; G :Smith’s Schlick-GGX

法线分布函数

法线分布函数使用统计学的方法近似计算微表面对齐于半角向量h的比例。众多不同版本的实现中我们使用Trowbridge-Reitz GGX的实现:
在这里插入图片描述

这里的h是用来计算镜面反射方向的半角向量,a是表面的粗糙度。如果h是通过计算表面法线和光照方向的半角计算而来,不同的粗糙度值会有不同的视觉效果:
在这里插入图片描述
当表面粗糙度很小时(表面平滑),对齐于半角向量h的微表面会高度集中于一个小的半径内,因此显示一个非常亮的斑点。然而,在粗糙的表面,微表面的朝向分布更加随机,你会发现更大区域的微表面对齐于半角向量,但是因为不再集中,我们会看到更加暗淡偏灰色的结果。
使用GLSL代码的的Trowbridge-Reitz GGX NDF实现方式如下:

float DistributionGGX(vec3 N, vec3 H, float a)
{
float a2 = a*a;
float NdotH = max(dot(N, H), 0.0);
float NdotH2 = NdotH*NdotH;
float nom = a2;
float denom = (NdotH2 * (a2 - 1.0) + 1.0);
denom = PI * denom * denom;return nom / denom;
}

几何方程

几何方程从统计学角度近似计算因为微表面互相遮挡导致的光线被闭塞的表面区域
在这里插入图片描述
类似于NDF,几何方程使用材质的粗糙度作为输入,更加粗糙的表面有更高的概率产生互相遮挡的微表面。我们使用的几何方程是GGX 和Schlick-Beckmann 近似的组合方法,称之为 Schlick-GGX:
在这里插入图片描述
这里的K是对表面粗糙度a的重映射,根据我们的几何函数是用于直接光源还是IBL光照有不同的计算方式:
在这里插入图片描述
需要注意的是a的值可能根据引擎把粗糙度转换为a的方式不同而不同。下面我们会讨论这些重映射在哪里并且如何发生:
为了高效的近似几何函数,我们需要考虑观察方向v(视线被凸出的微表面遮挡导致后面的反射的光线不能被观察到)和光源方向l(光线被凸出的几何表面遮挡产生阴影)。在Smith的方法中我们把这些都考虑在内:
在这里插入图片描述
使用Smith的方法,使用Schlick-GGX的方程作为Gsub,不同的粗糙度值R可以得到不同的结果:
在这里插入图片描述
可以看到,更加粗糙的表面会更加暗,因为更多的入射光线和反射光线被凹凸的表面遮挡, 几何函数的GLSL实现如下:

float GeometrySchlickGGX(float NdotV, float k)
{
float nom = NdotV;
float denom = NdotV * (1.0 - k) + k;
return nom / denom;
}
float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
{
float NdotV = max(dot(N, V), 0.0);
float NdotL = max(dot(N, L), 0.0);
float ggx1 = GeometrySchlickGGX(NdotV, k);
float ggx2 = GeometrySchlickGGX(NdotL, k);
return ggx1 * ggx2;
}

菲涅尔方程(Fresnel equation)

菲涅尔方程描述反射部分和折射部分的光线的比例,而这个比例根据我们观察表面的角度不同而不同。光线投射到表面时,基于表面法线和观察方向的夹角,菲涅尔方程计算出发射的光线的比例。根据这个反射的比例和能量守恒我们可以直接计算出发生折射的光线的能量的比例。
每一种材质或者表面,当垂直观测时都有自己的基本的反射率,但是当从一定的角度观测时,相对于基本的反射率所有的反射会变得更加明显。所有的材质如果从90°角(平行于表面)观测时理论上反射所有的入射光线,这一现象叫做菲涅尔现象,通过菲涅尔方程进行描述。

注:这里的根据观察方向不同而反射率不同,是指的光线的出射方向刚好是观察方向时,出射光线的能量和对应的入射光线的能量比例,而不是材质本身的物理属性上所说的反射率。物理属性上的反射率应该描述为反射率会根据入射光线和表面法线的夹角而改变,但是物理上对于表面反射,出射方向和入射方向刚好关于表面法线对称,而我们讨论的所有反射都是可观测到的反射也就是反射方向刚好和观测方向一致,所以这里用观察方向和表面法线的夹角代替入射光线(或者出射光线)和表面的夹角是完全没有问题的。同时这里提到的观察方向和表面平行时,理论上反射所有的入射光线,是基于菲涅尔方程中的折射定律,此时折射方向和反射方向重叠,所以认为全部的入射光线的能量都发生了反射,而没有折射进入材质内部的光线。

菲涅尔方程非常复杂,但是我们可以使用Fresnel-Schlick 近似法进行近似:
在这里插入图片描述
这里F0代表材质的基本反射率,我们通过折射索引或者IOR(indices of refraction)来获取材质的基本反射率。观察下图,越靠近球型边缘的地方菲涅尔现象越明显,反射也更多。这里为了让效果更加明显,强化了标远处的菲涅尔反射,事实上没有这么强的效果:
在这里插入图片描述
Fresnel-Schlick 近似法只适用于非金属表面,对于金属表面,需要使用另一个菲涅尔方程来计算表面反射率。为了方便,我们预计算材质表面的基本反射率,通过观察角度进行插值,以便我们可以使用相同的方程处理金属和非金属材质。
一些常见材质的的表面反射率如下图所示:
在这里插入图片描述

这里有个有趣的现象是,对于所有的非金属材质,基本反射率不会超过0.17,而对于金属材质,基本反射率大多介于0.5-1.0之间。除此之外,对于金属表面基本反射率的RGB表示的三个通道参数不一样,而这只存在于金属表面。
这些金属表面和非金属表面的不同,催生出一种称之为金属工作流的渲染流程,给了表面材质一个额外的属性金属度(metalness)用来描述这个表面是金属材质还是非金属材质。

理论上来讲,金属性是一个二元类型:要么是金属表面要么是非金属表面,而不能是两个都是,例如0.5。然而,大部分渲染管线允许通过一个0-1的浮点数配置材质表面的金属度。这是因为缺少材质贴图来精确的描述那些金属表面有灰尘、划痕的现象。通过混合金属表面的这些非金属的部分的金属度例如灰尘/划痕来获取视觉上可信的结果。

通过预计算表面基本反射率F0,我们可以使用同样的Fresnel-Schlick近似法来描述金属和非金属表面。但是对金属表面,我们还是要对基本的反照率进行着色,通常通过如下方法来实现:

vec3 F0 = vec3(0.04);
F0 = mix(F0, surfaceColor.rgb, metalness);

我们定义了一个接近于大多数非金属表面的基本的反射率0.04。使用0.04作为大多数非金属材质的基本反射率,不需要额外的表面属性,就可以产生物理上可信的结果。然后基于表面金属度的程度,我们使用基本非金属反射率0.04和金属反射率从表面颜色取值的混合结果作为最终的基本反射率。因为金属表面吸收所有的折射光而不产生漫反射,我们可以直接使用表面颜色作为基本的反射率。Fresnel Schlick 近似法的GLSL实现如下:

vec3 fresnelSchlick(float cosTheta, vec3 F0)
{
return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
}

这里的cosTheta是发现和观察方向的点乘结果。

Cook-Torrance 反射方程

描述过Cook-Torrance BRDF 的每一部分之后,我们可以把基于物理的BRDF引入到最终的反射方程中。
在这里插入图片描述

这个方程在数学上并不是完全正确的。你一定记得代表Fresnel 方程的F已经描述了表面反射的比例。也就是说反射方程的反射部分已经暗含了反射比率ks。因此我们最终的反射方程应该是:
在这里插入图片描述
这个方程现在完全描述了一个基于物理的渲染模型,也即是我们常说的PBR。没有完全理解如何把这里的数学公式应用于代码也不需担心,下一个教程会展示如何利用这个反射方程来获取更加物理可信的结果。

Authoring PBR materials

理解了PBR的基础数学模型之后,我们最后讨论下艺术家如何提供表面材质的物理属性以便我们可以直接填充到PBR的方程中。PBR材质的 的每一个属性都可以用一张贴图定义。使用贴图可以在片元的层级控制PBR方程的每一个属性:该点的金属度、粗糙/平滑度或者表面如何响应不同波长的光。
在这里插入图片描述

  • Albedo: 表面反射率贴图指定材质表面每一个纹素的颜色或者金属材质的基本反照率。这类似于我们使用的漫反射贴图,但是不能包含所有的光照信息。漫反射贴图通常包含轻微的阴影或者变黑的裂缝,而这些内容在反照率贴图上是不能有的;只能包含表面颜色或者基本反射系数。
  • Normal:法线贴图的用法和传统用法一样,用来提供逐片元的法线信息,来获取视觉上更加精细的表面凹凸效果。
  • Metallic:金属度贴图逐片元指定一个象素是否金属表面。基于BRP引擎的实现方式的不同,艺术家可以以灰度图或者二进制的黑白图来描述表面金属度。
  • Roughness: 表面粗糙度贴图用来逐片元的指定表面的粗糙程度。采样的粗糙度数值,影响到到统计学上的微表面朝向。一个更加粗糙的表面会有宽而模糊的反射,相反光滑的表面会有更加集中和清晰的反射。一些PBR引擎使用一张光滑度贴图来更加贴近艺术家的直觉理解,但是内部实现上依然是转换(1.0-光滑度)为粗糙度来参与计算。
  • AO:环境遮罩贴图或者AO贴图指定物体表面表面以及潜在的周围的几何体的一个额外的阴影因子。如果我们有一个砖墙的表面,表面反射率贴图不会有关于砖块接缝处的阴影信息。这时候就需要AO贴图来指定这些阴影边缘。在光照阶段的最后引入AO贴图,可以明显的提高场景的渲染质量。AO贴图可以手动生成,也可以通过3D建模软件进行预计算生成。

艺术家设置和调整这些逐片元的基于物理的输入值时,可以基于真实世界的材质表面的物理属性进行。这是PBR渲染管线的最大的优势,因为无论环境或光源如何修改,这些物理属性都保持一致,这也使艺术家获取物理可信的结果更加容易。对材质属性的设置,可以在不同的PBR渲染引擎间共享,即使环境改变,仍然可以获取正确的结果。

Further reading

  • Background: Physics and Math of Shading by Naty Hoffmann: there is too much theory to fully discuss in a single article so the theory here barely scratches the surface; if you want to know more about the physics of light and how it relates to the theory of PBR this is the resource you want to read.
  • Real shading in Unreal Engine 4: discusses the PBR model adopted by Epic Games in their 4th Unreal Engine installment. The PBR system we’ll focus on in these tutorials is based on this model of PBR.
  • Marmoset: PBR Theory: an introduction to PBR mostly meant for artists, but nevertheless a good read.
  • Coding Labs: Physically based rendering: an introduction to the render equation and how it relates to PBR.
  • Coding Labs: Physically Based Rendering - Cook–Torrance: an introduction to the Cook-Torrance BRDF.
  • Wolfire Games - Physically based rendering: an introduction to PBR by Lukas Orsvärn.
  • [SH17C] Physically Based Shading: a great interactive shadertoy example (warning: might take a while to load) by Krzysztof Narkowi showcasing light-material interaction in a PBR fashion.

猜你喜欢

转载自blog.csdn.net/u013746357/article/details/84945226
PBR