mirror of
https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git
synced 2025-08-23 04:35:28 +08:00
@@ -32,7 +32,7 @@ int main()
|
||||
}
|
||||
```
|
||||
|
||||
首先,我们在main函数中调用<fun>glfwInit</fun>函数来初始化GLFW,然后我们可以使用<fun>glfwWindowHint</fun>函数来配置GLFW。<fun>glfwWindowHint</fun>函数的第一个参数代表选项的名称,我们可以从很多以`GLFW_`开头的枚举值中选择;第二个参数接受一个整形,用来设置这个选项的值。该函数的所有的选项以及对应的值都可以在 [GLFW's window handling](http://www.glfw.org/docs/latest/window.html#window_hints) 这篇文档中找到。如果你现在编译你的cpp文件会得到大量的 *undefined reference* (未定义的引用)错误,也就是说你并未顺利地链接GLFW库。
|
||||
首先,我们在main函数中调用<fun>glfwInit</fun>函数来初始化GLFW,然后我们可以使用<fun>glfwWindowHint</fun>函数来配置GLFW。<fun>glfwWindowHint</fun>函数的第一个参数代表选项的名称,我们可以从很多以`GLFW_`开头的枚举值中选择;第二个参数接受一个整型,用来设置这个选项的值。该函数的所有的选项以及对应的值都可以在 [GLFW's window handling](http://www.glfw.org/docs/latest/window.html#window_hints) 这篇文档中找到。如果你现在编译你的cpp文件会得到大量的 *undefined reference* (未定义的引用)错误,也就是说你并未顺利地链接GLFW库。
|
||||
|
||||
由于本站的教程都是基于OpenGL 3.3版本展开讨论的,所以我们需要告诉GLFW我们要使用的OpenGL版本是3.3,这样GLFW会在创建OpenGL上下文时做出适当的调整。这也可以确保用户在没有适当的OpenGL版本支持的情况下无法运行。我们将主版本号(Major)和次版本号(Minor)都设为3。我们同样明确告诉GLFW我们使用的是核心模式(Core-profile)。明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集(没有我们已不再需要的向后兼容特性)。如果使用的是Mac OS X系统,你还需要加下面这行代码到你的初始化代码中这些配置才能起作用(将上面的代码解除注释):
|
||||
|
||||
|
@@ -449,7 +449,7 @@ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
|
||||
|
||||
当一个点比光的远平面还要远时,它的投影坐标的z坐标大于1.0。这种情况下,GL_CLAMP_TO_BORDER环绕方式不起作用,因为我们把坐标的z元素和深度贴图的值进行了对比;它总是为大于1.0的z返回true。
|
||||
|
||||
解决这个问题也很简单,我们简单的强制把shadow的值设为0.0,不管投影向量的z坐标是否大于1.0:
|
||||
解决这个问题也很简单,只要投影向量的z坐标大于1.0,我们就把shadow的值强制设为0.0:
|
||||
|
||||
```c++
|
||||
float ShadowCalculation(vec4 fragPosLightSpace)
|
||||
|
@@ -193,10 +193,10 @@ void main()
|
||||
```c++
|
||||
#version 330 core
|
||||
in vec4 FragPos;
|
||||
|
||||
|
||||
uniform vec3 lightPos;
|
||||
uniform float far_plane;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
// get distance between fragment and light source
|
||||
@@ -205,7 +205,7 @@ void main()
|
||||
// map to [0;1] range by dividing by far_plane
|
||||
lightDistance = lightDistance / far_plane;
|
||||
|
||||
// Write this as modified depth
|
||||
// write this as modified depth
|
||||
gl_FragDepth = lightDistance;
|
||||
}
|
||||
```
|
||||
|
@@ -301,7 +301,7 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float k)
|
||||
菲涅尔方程是一个相当复杂的方程式,不过幸运的是菲涅尔方程可以用<def>Fresnel-Schlick</def>近似法求得近似解:
|
||||
|
||||
$$
|
||||
F_{Schlick}(n, v, F_0) = F_0 + (1 - F_0) ( 1 - (n \cdot v))^5
|
||||
F_{Schlick}(h, v, F_0) = F_0 + (1 - F_0) ( 1 - (h \cdot v))^5
|
||||
$$
|
||||
|
||||
\(F_0\)表示平面的基础反射率,它是利用所谓**折射指数**(Indices of Refraction)或者说IOR计算得出的。然后正如你可以从球体表面看到的那样,我们越是朝球面掠角的方向上看(此时视线和表面法线的夹角接近90度)菲涅尔现象就越明显,反光就越强:
|
||||
|
@@ -50,9 +50,6 @@ pages:
|
||||
- 泛光: '05 Advanced Lighting/07 Bloom.md'
|
||||
- 延迟着色法: '05 Advanced Lighting/08 Deferred Shading.md'
|
||||
- SSAO: '05 Advanced Lighting/09 SSAO.md'
|
||||
- 特效:
|
||||
- 雾: '08 Effects/01 Fog.md'
|
||||
- 卡通着色: '08 Effects/02 Toon shading.md'
|
||||
- PBR:
|
||||
- 理论: '07 PBR/01 Theory.md'
|
||||
- 光照: '07 PBR/02 Lighting.md'
|
||||
|
Reference in New Issue
Block a user