1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-22 20:25:28 +08:00

Merge pull request #199 from coppX/new-theme, fix #127

修改关于Normal Distribution Function的翻译
This commit is contained in:
K
2021-12-06 23:05:09 -05:00
committed by GitHub
3 changed files with 7 additions and 7 deletions

View File

@@ -192,18 +192,18 @@ $$
f_{cook-torrance} = \frac{DFG}{4(\omega_o \cdot n)(\omega_i \cdot n)}
$$
Cook-Torrance BRDF的镜面反射部分包含三个函数此外分母部分还有一个标准化因子 。字母DF与G分别代表着一种类型的函数各个函数分别用来近似的计算出表面反射特性的一个特定部分。三个函数分别为正态分布函数(Normal **D**istribution Function),菲涅尔方程(**F**resnel Rquation)和几何函数(**G**eometry Function)
Cook-Torrance BRDF的镜面反射部分包含三个函数此外分母部分还有一个标准化因子 。字母DF与G分别代表着一种类型的函数各个函数分别用来近似的计算出表面反射特性的一个特定部分。三个函数分别为法线分布函数(Normal **D**istribution Function),菲涅尔方程(**F**resnel Rquation)和几何函数(**G**eometry Function)
- **正态分布函数**:估算在受到表面粗糙度的影响下,取向方向与中间向量一致的微平面的数量。这是用来估算微平面的主要函数。
- **法线分布函数**:估算在受到表面粗糙度的影响下,取向方向与中间向量一致的微平面的数量。这是用来估算微平面的主要函数。
- **几何函数**:描述了微平面自成阴影的属性。当一个平面相对比较粗糙的时候,平面表面上的微平面有可能挡住其他的微平面从而减少表面所反射的光线。
- **菲涅尔方程**:菲涅尔方程描述的是在不同的表面角下表面所反射的光线所占的比率。
以上的每一种函数都是用来估算相应的物理参数的而且你会发现用来实现相应物理机制的每种函数都有不止一种形式。它们有的非常真实有的则性能高效。你可以按照自己的需求任意选择自己想要的函数的实现方法。英佩游戏公司的Brian Karis对于这些函数的多种近似实现方式进行了大量的[研究](http://graphicrants.blogspot.nl/2013/08/specular-brdf-reference.html)。我们将会采用Epic Games在Unreal Engine 4中所使用的函数其中D使用Trowbridge-Reitz GGXF使用Fresnel-Schlick近似(Fresnel-Schlick Approximation)而G使用Smith's Schlick-GGX。
### 正态分布函数
### 法线分布函数
<def>正态分布函数</def>\(D\),或者说镜面分布,从统计学上近似的表示了与某些(中间)向量\(h\)取向一致的微平面的比率。举例来说,假设给定向量\(h\)如果我们的微平面中有35%与向量\(h\)取向一致,则正态分布函数或者说NDF将会返回0.35。目前有很多种NDF都可以从统计学上来估算微平面的总体取向度只要给定一些粗糙度的参数以及一个我们马上将会要用到的参数Trowbridge-Reitz GGX
<def>法线分布函数</def>\(D\),或者说镜面分布,从统计学上近似的表示了与某些(中间)向量\(h\)取向一致的微平面的比率。举例来说,假设给定向量\(h\)如果我们的微平面中有35%与向量\(h\)取向一致,则法线分布函数或者说NDF将会返回0.35。目前有很多种NDF都可以从统计学上来估算微平面的总体取向度只要给定一些粗糙度的参数以及一个我们马上将会要用到的参数Trowbridge-Reitz GGX
$$
NDF_{GGX TR}(n, h, \alpha) = \frac{\alpha^2}{\pi((n \cdot h)^2 (\alpha^2 - 1) + 1)^2}
@@ -217,7 +217,7 @@ $$
当粗糙度很低也就是说表面很光滑的时候与中间向量取向一致的微平面会高度集中在一个很小的半径范围内。由于这种集中性NDF最终会生成一个非常明亮的斑点。但是当表面比较粗糙的时候微平面的取向方向会更加的随机。你将会发现与\(h\)向量取向一致的微平面分布在一个大得多的半径范围内,但是同时较低的集中性也会让我们的最终效果显得更加灰暗。
使用GLSL代码编写的Trowbridge-Reitz GGX正态分布函数是下面这个样子的:
使用GLSL代码编写的Trowbridge-Reitz GGX法线分布函数是下面这个样子的:
```c++
float D_GGX_TR(vec3 N, vec3 H, float a)

View File

@@ -141,7 +141,7 @@ vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
你可以看到,对于非金属材质来说`F0`永远保持0.04这个值,我们会根据表面的金属性来改变`F0`这个值, 并且在原来的`F0`和反射率中插值计算`F0`
我们已经算出\(F\) 剩下的项就是计算正态分布函数\(D\)和几何遮蔽函数\(G\)了。
我们已经算出\(F\) 剩下的项就是计算法线分布函数\(D\)和几何遮蔽函数\(G\)了。
因此一个直接PBR光照着色器中\(D\)和\(G\)的计算代码类似于:

View File

@@ -45,7 +45,7 @@ $$
![](../../img/07/03/02/ibl_prefilter_map.png)
我们使用 Cook-Torrance BRDF 的正态分布函数(NDF)生成采样向量及其散射强度,该函数将法线和视角方向作为输入。由于我们在卷积环境贴图时事先不知道视角方向,因此 Epic Games 假设视角方向——也就是镜面反射方向——总是等于输出采样方向\(\omega_o\),以作进一步近似。翻译成代码如下:
我们使用 Cook-Torrance BRDF 的法线分布函数(NDF)生成采样向量及其散射强度,该函数将法线和视角方向作为输入。由于我们在卷积环境贴图时事先不知道视角方向,因此 Epic Games 假设视角方向——也就是镜面反射方向——总是等于输出采样方向\(\omega_o\),以作进一步近似。翻译成代码如下:
```c++
vec3 N = normalize(w_o);