diff --git a/docs/02 Lighting/06 Multiple lights.md b/docs/02 Lighting/06 Multiple lights.md index 9dc08c4..c7117b3 100644 --- a/docs/02 Lighting/06 Multiple lights.md +++ b/docs/02 Lighting/06 Multiple lights.md @@ -4,9 +4,9 @@ ---|--- 作者 | JoeyDeVries 翻译 | [Geequlim](http://geequlim.com), Krasjet -校对 | 暂未校对 +校对 | [AoZhang](https://github.com/SuperAoao) -我们在前面的教程中已经学习了许多关于OpenGL中光照的知识,其中包括冯氏着色(Phong Shading)、材质(Material)、光照贴图(Lighting Map)以及不同种类的投光物(Light Caster)。在这一节中,我们将结合之前学过的所有知识,创建一个包含六个光源的场景。我们将模拟一个类似太阳的定向光(Directional Light)光源,四个分散在场景中的点光源(Point Light),以及一个手电筒(Flashlight)。 +我们在前面的教程中已经学习了许多关于OpenGL中光照的知识,其中包括冯氏着色(Phong Shading)、材质(Material)、光照贴图(Lighting Map)以及不同种类的投光物(Light Caster)。在这一节中,我们将结合之前学过的所有知识,创建一个包含六个光源的完全照明场景。我们将模拟一个类似太阳的定向光(Directional Light)光源,四个分散在场景中的点光源(Point Light),以及一个手电筒(Flashlight)。 为了在场景中使用多个光源,我们希望将光照计算封装到GLSL函数中。这样做的原因是,每一种光源都需要一种不同的计算方法,而一旦我们想对多个光源进行光照计算时,代码很快就会变得非常复杂。如果我们只在main函数中进行所有的这些计算,代码很快就会变得难以理解。 @@ -168,6 +168,10 @@ void main() 每个光源类型都将它们的贡献加到了最终的输出颜色上,直到所有的光源都处理完了。最终的颜色包含了场景中所有光源的颜色影响所合并的结果。如果你想的话,你也可以实现一个聚光,并将它的效果加到输出颜色中。我们会将CalcSpotLight函数留给读者作为练习。 +!!! Important + + 在这种方法中有很多重复的计算在光类型函数上(例如计算反射向量,漫反射和高光项,以及对材料纹理进行采样),所以这里有优化的空间。 + 设置定向光结构体的uniform应该非常熟悉了,但是你可能会在想我们该如何设置点光源的uniform值,因为点光源的uniform现在是一个PointLight的数组了。这并不是我们以前讨论过的话题。 很幸运的是,这并不是很复杂,设置一个结构体数组的uniform和设置一个结构体的uniform是很相似的,但是这一次在访问uniform位置的时候,我们需要定义对应的数组下标值: diff --git a/docs/img/02/06/multiple_lights_combined.png b/docs/img/02/06/multiple_lights_combined.png index 0d28901..855c6cf 100644 Binary files a/docs/img/02/06/multiple_lights_combined.png and b/docs/img/02/06/multiple_lights_combined.png differ