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

改进翻译

根据原文Specular Lighting部分,改进翻译,修改了几处翻译错误。
This commit is contained in:
WEI Wen
2022-04-26 01:19:15 +08:00
committed by GitHub
parent fa20405a2d
commit 86c9e6b6d4

View File

@@ -207,19 +207,19 @@ Normal = mat3(transpose(inverse(model))) * aNormal;
如果你还没被这些光照计算搞得精疲力尽,我们就再把镜面高光(Specular Highlight)加进来,这样冯氏光照才算完整。
和漫反射光照一样,镜面光照也是依据光的方向向量和物体的法向量来决定的,但是它也依赖于观察方向,例如玩家是从什么方向看这个片段的。镜面光照是基于光的反射特性。如果我们想象物体表面一面镜子一样,那么,无论我们从哪里去看那个表面反射的光,镜面光照都会达到最大化。你可以从下面的图片看到效果:
和漫反射光照一样,镜面光照也决定于光的方向向量和物体的法向量,但是它也决定于观察方向,例如玩家是从什么方向看这个片段的。镜面光照决定于表面的反射特性。如果我们物体表面设想为一面镜子,那么镜面光照最强的地方就是我们看到表面反射光的地方。你可以在下图中看到效果:
![](../img/02/02/basic_lighting_specular_theory.png)
我们通过反射法向量周围光的方向来计算反射向量。然后我们计算反射向量和视线方向的角度差,如果夹角越小,那么镜面光的影响就会越大。它的作用效果就是,我们去看光被物体所反射的那个方向的时候,我们会看到一高光。
我们通过根据法向量翻折入射光的方向来计算反射向量。然后我们计算反射向量与观察方向的角度差,它们之间夹角越小,镜面光的作用就越大。由此产生的效果就是,我们看向在入射光在表面的反射方向时,会看到一高光。
观察向量是镜面光照附加的一个变量,我们可以使用观察者世界空间位置和片段的位置来计算它。之后我们计算镜面光强度,用它乘以光源的颜色,将它加上环境光和漫反射分量
观察向量是我们计算镜面光照时需要的一个额外变量,我们可以使用观察者世界空间位置和片段的位置来计算它。之后我们计算镜面光强度,用它乘以光源的颜色,将它环境光和漫反射光照部分加和
!!! Important
我们选择在世界空间进行光照计算,但是大多数人趋向于在观察空间进行光照计算。在观察空间计算的好处是,观察者的位置总是(0, 0, 0),所以这样你直接就获得了观察者位置。可是我发现在学习的时候在世界空间中计算光照更符合直觉。如果你仍然希望在观察空间计算光照的话,你需要将所有相关的向量用观察矩阵进行变换(记得也要改变法线矩阵)。
我们选择在世界空间进行光照计算,但是大多数人趋向于更偏向在观察空间进行光照计算。在观察空间计算的优势是,观察者的位置总是(0, 0, 0),所以你已经零成本地拿到了观察者位置。然而,若以学习为目的,我认为在世界空间中计算光照更符合直觉。如果你仍然希望在观察空间计算光照的话,你需要将所有相关的向量用观察矩阵进行变换(不要忘记也修改法线矩阵)。
为了得到观察者的世界空间坐标,我们简单地使用摄像机对象的位置坐标代替(它当然就是观察者)。所以我们把另一个uniform添加到片段着色器,把相应的摄像机位置坐标传给片段着色器:
得到观察者的世界空间坐标,我们直接使用摄像机的位置向量即可(它当然就是那个观察者)。那么让我们把另一个uniform添加到片段着色器中,并把摄像机位置向量传给着色器:
```c++
uniform vec3 viewPos;