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

docs: replace 冯氏 to 风氏

This commit is contained in:
夜轮_NachtgeistW
2024-07-22 15:53:17 +08:00
committed by Gary Wang
parent 6c4ad5ec81
commit c4b1eb0dd8
7 changed files with 33 additions and 33 deletions

View File

@@ -6,12 +6,12 @@
翻译 | [Django](http://bullteacher.com/), Krasjet, Geequlim, [BLumia](https://github.com/blumia/)
校对 | [AoZhang](https://github.com/SuperAoao)
现实世界的光照是极其复杂的而且会受到诸多因素的影响这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型对现实的情况进行近似这样处理起来会更容易一些而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为<def>氏光照模型</def>(Phong Lighting Model)。氏光照模型的主要结构由3个分量组成环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子:
现实世界的光照是极其复杂的而且会受到诸多因素的影响这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型对现实的情况进行近似这样处理起来会更容易一些而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为<def>氏光照模型</def>(Phong Lighting Model)。氏光照模型的主要结构由3个分量组成环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子:
![](../img/02/02/basic_lighting_phong.png)
- <def>环境光照</def>(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。
- <def>漫反射光照</def>(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。
- <def>漫反射光照</def>(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。
- <def>镜面光照</def>(Specular Lighting):模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。
为了创建有趣的视觉场景,我们希望模拟至少这三种光照分量。我们将以最简单的一个开始:**环境光照**。
@@ -35,7 +35,7 @@ void main()
}
```
如果你现在运行你的程序,你会注意到氏光照的第一个阶段已经应用到你的物体上了。这个物体非常暗,但由于应用了环境光照(注意光源立方体没受影响是因为我们对它使用了另一个着色器),也不是完全黑的。它看起来应该像这样:
如果你现在运行你的程序,你会注意到氏光照的第一个阶段已经应用到你的物体上了。这个物体非常暗,但由于应用了环境光照(注意光源立方体没受影响是因为我们对它使用了另一个着色器),也不是完全黑的。它看起来应该像这样:
![](../img/02/02/ambient_lighting.png)
@@ -205,7 +205,7 @@ Normal = mat3(transpose(inverse(model))) * aNormal;
# 镜面光照
如果你还没被这些光照计算搞得精疲力尽,我们就再把镜面高光(Specular Highlight)加进来,这样氏光照才算完整。
如果你还没被这些光照计算搞得精疲力尽,我们就再把镜面高光(Specular Highlight)加进来,这样氏光照才算完整。
和漫反射光照一样,镜面光照也决定于光的方向向量和物体的法向量,但是它也决定于观察方向,例如玩家是从什么方向看向这个片段的。镜面光照决定于表面的反射特性。如果我们把物体表面设想为一面镜子,那么镜面光照最强的地方就是我们看到表面上反射光的地方。你可以在下图中看到效果:
@@ -262,7 +262,7 @@ vec3 result = (ambient + diffuse + specular) * objectColor;
FragColor = vec4(result, 1.0);
```
我们现在为氏光照计算了全部的光照分量。根据你的视角,你可以看到类似下面的画面:
我们现在为氏光照计算了全部的光照分量。根据你的视角,你可以看到类似下面的画面:
![](../img/02/02/basic_lighting_specular.png)
@@ -270,17 +270,17 @@ FragColor = vec4(result, 1.0);
!!! Important
在光照着色器的早期,开发者曾经在顶点着色器中实现氏光照模型。在顶点着色器中做光照的优势是,相比片段来说,顶点要少得多,因此会更高效,所以(开销大的)光照计算频率会更低。然而,顶点着色器中的最终颜色值是仅仅只是那个顶点的颜色值,片段的颜色值是由插值光照颜色所得来的。结果就是这种光照看起来不会非常真实,除非使用了大量顶点。
在光照着色器的早期,开发者曾经在顶点着色器中实现氏光照模型。在顶点着色器中做光照的优势是,相比片段来说,顶点要少得多,因此会更高效,所以(开销大的)光照计算频率会更低。然而,顶点着色器中的最终颜色值是仅仅只是那个顶点的颜色值,片段的颜色值是由插值光照颜色所得来的。结果就是这种光照看起来不会非常真实,除非使用了大量顶点。
![](../img/02/02/basic_lighting_gouruad.png)
在顶点着色器中实现的氏光照模型叫做<def>Gouraud着色</def>(Gouraud Shading),而不是<def>氏着色</def>(Phong Shading)。记住,由于插值,这种光照看起来有点逊色。氏着色能产生更平滑的光照效果。
在顶点着色器中实现的氏光照模型叫做<def>Gouraud着色</def>(Gouraud Shading),而不是<def>氏着色</def>(Phong Shading)。记住,由于插值,这种光照看起来有点逊色。氏着色能产生更平滑的光照效果。
现在你应该能够看到着色器的强大之处了。只用很少的信息,着色器就能计算出光照如何影响到所有物体的片段颜色。[下一节](03 Materials.md)中,我们会更深入的研究光照模型,看看我们还能做些什么。
## 练习
- 目前,我们的光源是静止的,你可以尝试使用<fun>sin</fun><fun>cos</fun>函数让光源在场景中来回移动。观察光照随时间的改变能让你更容易理解氏光照模型。[参考解答](https://learnopengl.com/code_viewer.php?code=lighting/basic_lighting-exercise1)。
- 目前,我们的光源是静止的,你可以尝试使用<fun>sin</fun><fun>cos</fun>函数让光源在场景中来回移动。观察光照随时间的改变能让你更容易理解氏光照模型。[参考解答](https://learnopengl.com/code_viewer.php?code=lighting/basic_lighting-exercise1)。
- 尝试使用不同的环境光、漫反射和镜面强度,观察它们怎么是影响光照效果的。同样,尝试实验一下镜面光照的反光度因子。尝试理解为什么某一个值能够有着特定视觉输出。
- 在观察空间(而不是世界空间)中计算氏光照:[参考解答](https://learnopengl.com/code_viewer.php?code=lighting/basic_lighting-exercise2)。
- 尝试实现一个Gouraud着色而不是氏着色)。如果你做对了话,立方体的光照应该会[看起来有些奇怪](../img/02/02/basic_lighting_exercise3.png),尝试推理为什么它会看起来这么奇怪:[参考解答](https://learnopengl.com/code_viewer.php?code=lighting/basic_lighting-exercise3)。
- 在观察空间(而不是世界空间)中计算氏光照:[参考解答](https://learnopengl.com/code_viewer.php?code=lighting/basic_lighting-exercise2)。
- 尝试实现一个Gouraud着色而不是氏着色)。如果你做对了话,立方体的光照应该会[看起来有些奇怪](../img/02/02/basic_lighting_exercise3.png),尝试推理为什么它会看起来这么奇怪:[参考解答](https://learnopengl.com/code_viewer.php?code=lighting/basic_lighting-exercise3)。

View File

@@ -25,7 +25,7 @@ uniform Material material;
在片段着色器中,我们创建一个结构体(Struct)来储存物体的材质属性。我们也可以把它们储存为独立的uniform值但是作为一个结构体来储存会更有条理一些。我们首先定义结构体的布局(Layout)然后简单地以刚创建的结构体作为类型声明一个uniform变量。
如你所见,我们为氏光照模型的每个分量都定义一个颜色向量。<var>ambient</var>材质向量定义了在环境光照下这个表面反射的是什么颜色,通常与表面的颜色相同。<var>diffuse</var>材质向量定义了在漫反射光照下表面的颜色。漫反射颜色(和环境光照一样)也被设置为我们期望的物体颜色。<var>specular</var>材质向量设置的是表面上镜面高光的颜色(或者甚至可能反映一个特定表面的颜色)。最后,<var>shininess</var>影响镜面高光的散射/半径。
如你所见,我们为氏光照模型的每个分量都定义一个颜色向量。<var>ambient</var>材质向量定义了在环境光照下这个表面反射的是什么颜色,通常与表面的颜色相同。<var>diffuse</var>材质向量定义了在漫反射光照下表面的颜色。漫反射颜色(和环境光照一样)也被设置为我们期望的物体颜色。<var>specular</var>材质向量设置的是表面上镜面高光的颜色(或者甚至可能反映一个特定表面的颜色)。最后,<var>shininess</var>影响镜面高光的散射/半径。
有这4个元素定义一个物体的材质我们能够模拟很多现实世界中的材质。[devernay.free.fr](http://devernay.free.fr/cours/opengl/materials.html)中的一个表格展示了一系列材质属性,它们模拟了现实世界中的真实材质。下图展示了几组现实世界的材质参数值对我们的立方体的影响:

View File

@@ -6,7 +6,7 @@
翻译 | [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<def>函数</def>中。这样做的原因是,每一种光源都需要一种不同的计算方法,而一旦我们想对多个光源进行光照计算时,代码很快就会变得非常复杂。如果我们只在<fun>main</fun>函数中进行所有的这些计算,代码很快就会变得难以理解。

View File

@@ -8,24 +8,24 @@
恭喜您已经学习到了这个地方辛苦啦不知道你有没有注意到总的来说我们在学习光照教程的时候关于OpenGL本身并没有什么新东西除了像访问uniform数组这样细枝末节的知识。目前为止的所有教程都是关于使用一些技巧或者公式来操作着色器达到真实的光照效果。这再一次向你展示了着色器的威力。着色器是非常灵活的你也亲眼见证了我们仅仅使用一些3D向量和可配置的变量就能够创造出惊人的图像这一点。
在前面的几个教程中,你学习了颜色、氏光照模型(包括环境光照、漫反射光照和镜面光照)、物体的材质、可配置的光照属性、漫反射和镜面光贴图、不同种类的光,并且学习了怎样将所有所学知识融会贯通,结合到一个完全照明的场景中。记得去实验一下不同的光照、材质颜色、光照属性,并且试着利用你无穷的创造力创建自己的环境。
在前面的几个教程中,你学习了颜色、氏光照模型(包括环境光照、漫反射光照和镜面光照)、物体的材质、可配置的光照属性、漫反射和镜面光贴图、不同种类的光,并且学习了怎样将所有所学知识融会贯通,结合到一个完全照明的场景中。记得去实验一下不同的光照、材质颜色、光照属性,并且试着利用你无穷的创造力创建自己的环境。
在[下一节](../03 Model Loading/01 Assimp.md)当中,我们在我们的场景当中加入更高级的几何形状,这些形状将会在我们之前讨论过的光照模型中非常好看。
## 词汇表
- **颜色向量(Color Vector)**:一个通过红绿蓝(RGB)分量的组合描绘大部分真实颜色的向量。一个物体的颜色实际上是该物体所不能吸收的反射颜色分量。
- **氏光照模型(Phong Lighting Model)**:一个通过计算环境光,漫反射,和镜面光分量的值来近似真实光照的模型。
- **氏光照模型(Phong Lighting Model)**:一个通过计算环境光,漫反射,和镜面光分量的值来近似真实光照的模型。
- **环境光照(Ambient Lighting)**:通过给每个没有被光照的物体很小的亮度,使其不是完全黑暗的,从而对全局光照进行近似。
- **漫反射着色(Diffuse Shading)**:一个顶点/片段与光线方向越接近,光照会越强。使用了法向量来计算角度。
- **法向量(Normal Vector)**:一个垂直于平面的单位向量。
- **法线矩阵(Normal Matrix)**一个3x3矩阵或者说是没有平移的模型或者模型-观察)矩阵。它也被以某种方式修改(逆转置),从而在应用非统一缩放时,保持法向量朝向正确的方向。否则法向量会在使用非统一缩放时被扭曲。
- **镜面光照(Specular Lighting)**:当观察者视线靠近光源在表面的反射线时会显示的镜面高光。镜面光照是由观察者的方向,光源的方向和设定高光分散量的反光度值三个量共同决定的。
- **氏着色(Phong Shading)**氏光照模型应用在片段着色器。
- **Gouraud着色(Gouraud shading)**氏光照模型应用在顶点着色器上。在使用很少数量的顶点时会产生明显的瑕疵。会得到效率提升但是损失了视觉质量。
- **氏着色(Phong Shading)**氏光照模型应用在片段着色器。
- **Gouraud着色(Gouraud shading)**氏光照模型应用在顶点着色器上。在使用很少数量的顶点时会产生明显的瑕疵。会得到效率提升但是损失了视觉质量。
- **GLSL结构体(GLSL struct)**一个类似于C的结构体用作着色器变量的容器。大部分时间用来管理输入/输出/uniform。
- **材质(Material)**:一个物体反射的环境光,漫反射,镜面光颜色。这些东西设定了物体所拥有的颜色。
- **光照属性(Light(properties))**:一个光的环境光,漫反射,镜面光的强度。可以使用任何颜色值,对每一个氏分量(Phong Component)定义光源发出的颜色/强度。
- **光照属性(Light(properties))**:一个光的环境光,漫反射,镜面光的强度。可以使用任何颜色值,对每一个氏分量(Phong Component)定义光源发出的颜色/强度。
- **漫反射贴图(Diffuse Map)**:一个设定了每个片段中漫反射颜色的纹理图片。
- **镜面光贴图(Specular Map)**:一个设定了每一个片段的镜面光强度/颜色的纹理贴图。仅在物体的特定区域显示镜面高光。
- **定向光(Directional Light)**:只有方向的光源。它被建模为无限距离,这使得它的所有光线看起来都是平行的,因此它的方向矢量在整个场景中保持不变。