diff --git a/docs/07 PBR/02 Lighting.md b/docs/07 PBR/02 Lighting.md index f08348a..b459b8c 100755 --- a/docs/07 PBR/02 Lighting.md +++ b/docs/07 PBR/02 Lighting.md @@ -60,7 +60,7 @@ float radiance = lightColor * attenuation * cosTheta; 这也让我们回到了对于表面的半球领域(hemisphere)\(\Omega\)的积分\(\int\)上。由于我们事先知道的所有贡献光源的位置,因此对物体表面上的一个点着色并不需要我们尝试去求解积分。我们可以直接拿光源的(已知的)数目,去计算它们的总辐照度,因为每个光源仅仅只有一个方向上的光线会影响物体表面的辐射率。这使得PBR对直接光源的计算相对简单,因为我们只需要有效地遍历所有有贡献的光源。而当我们后来把环境照明也考虑在内的[IBL]()教程中,我们就必须采取积分去计算了,这是因为光线可能会在任何一个方向入射。 -## 一个PBR表面模型 +# 一个PBR表面模型 现在让我们开始写片段着色器来实现上述的PBR模型吧~ 首先我们需要把PBR相关的输入放进片段着色器。 @@ -92,7 +92,7 @@ void main() } ``` -### 直接光照明 +## 直接光照明 在本教程的例子中我们会采用总共4个点光源来直接表示场景的辐照度。为了满足反射率方程,我们循环遍历每一个光源,计算他们独立的辐射率然后求和,接着根据BRDF和光源的入射角来缩放该辐射率。我们可以把循环当作在对物体的半球领域对所以直接光源求积分。首先我们来计算一些可以预计算的光照变量: @@ -229,7 +229,7 @@ vec3 ambient = vec3(0.03) * albedo * ao; vec3 color = ambient + Lo; ``` -### 线性空间和HDR渲染 +## 线性空间和HDR渲染 直到现在,我们假设的所有计算都在线性的颜色空间中进行的,因此我们需要在着色器最后做[伽马矫正]()。 在线性空间中计算光照是非常重要的,因为PBR要求所有输入都是线性的,如果不是这样,我们就会得到不正常的光照。另外,我们希望所有光照的输入都尽可能的接近他们在物理上的取值,这样他们的反射率或者说颜色值就会在色谱上有比较大的变化空间。`Lo`作为结果可能会变大得很快(超过1),但是因为默认的LDR输入而取值被截断。所以在伽马矫正之前我们采用色调映射使`Lo`从LDR的值映射为HDR的值。 @@ -244,7 +244,7 @@ color = pow(color, vec3(1.0/2.2)); 采用线性颜色空间和HDR在PBR渲染管线中非常重要。如果没有这些操作,几乎是不可能正确地捕获到因光照强度变化的细节,这最终会导致你的计算变得不正确,在视觉上看上去非常不自然。 -### 完整的直接光照PBR着色器 +## 完整的直接光照PBR着色器 现在剩下的事情就是把做好色调映射和伽马矫正的颜色值传给片段着色器的输出,然后我们就拥有了自己的直接光照PBR着色器。 为了完整性,这里给出了完整的代码: @@ -329,7 +329,7 @@ void main() 你可以在[这里](https://learnopengl.com/code_viewer_gh.php?code=src/6.pbr/1.1.lighting/lighting.cpp)找到整个demo的完整代码。 -## 带贴图的PBR +# 带贴图的PBR 把我们系统扩展成可以接受纹理作为参数可以让我们对物体的材质有更多的自定义空间: