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

Replace all the math equations with latex

This commit is contained in:
Meow J
2016-07-05 18:47:06 +08:00
parent ca728d41d6
commit e6c891f7cc
14 changed files with 171 additions and 657 deletions

View File

@@ -293,37 +293,53 @@ glBindFramebuffer(GL_FRAMEBUFFER, 0);
为了获取一个光源的体积半径,我们需要解一个对于一个我们认为是**黑暗(Dark)**的亮度(Brightness)的衰减方程它可以是0.0或者是更亮一点的但仍被认为黑暗的值像是0.03。为了展示我们如何计算光源的体积半径,我们将会使用一个在[投光物](http://learnopengl-cn.readthedocs.org/zh/latest/02%20Lighting/05%20Light%20casters/)这节中引入的一个更加复杂,但非常灵活的衰减方程:
![](../img/deferred_shading_1.png)
$$
F_{light} = \frac{I}{K_c + K_l * d + K_q * d^2}
$$
我们现在想要在![](../img/F_light.png)等于0的前提下解这个方程也就是说光在该距离完全是黑暗的。然而这个方程永远不会真正等于0.0所以它没有解。所以我们不会求表达式等于0.0时候的解相反我们会求当亮度值靠近于0.0的解,这时候它还是能被看做是黑暗的。在这个教程的演示场景中,我们选择![](../img/5256.png)作为一个合适的光照值除以256是因为默认的8-bit帧缓冲可以每个分量显示这么多强度值(Intensity)。
我们现在想要在\(F_{light}\)等于0的前提下解这个方程也就是说光在该距离完全是黑暗的。然而这个方程永远不会真正等于0.0所以它没有解。所以我们不会求表达式等于0.0时候的解相反我们会求当亮度值靠近于0.0的解,这时候它还是能被看做是黑暗的。在这个教程的演示场景中,我们选择\(5/256\)作为一个合适的光照值除以256是因为默认的8-bit帧缓冲可以每个分量显示这么多强度值(Intensity)。
!!! Important
我们使用的衰减方程在它的可视范围内基本都是黑暗的,所以如果我们想要限制它为一个比![](../img/5256.png)更加黑暗的亮度,光体积就会变得太大从而变得低效。只要是用户不能在光体积边缘看到一个突兀的截断,这个参数就没事了。当然它还是依赖于场景的类型,一个高的亮度阀值会产生更小的光体积,从而获得更高的效率,然而它同样会产生一个很容易发现的副作用,那就是光会在光体积边界看起来突然断掉。
我们使用的衰减方程在它的可视范围内基本都是黑暗的,所以如果我们想要限制它为一个比\(5/256\)更加黑暗的亮度,光体积就会变得太大从而变得低效。只要是用户不能在光体积边缘看到一个突兀的截断,这个参数就没事了。当然它还是依赖于场景的类型,一个高的亮度阀值会产生更小的光体积,从而获得更高的效率,然而它同样会产生一个很容易发现的副作用,那就是光会在光体积边界看起来突然断掉。
我们要求的衰减方程会是这样:
![](../img/deferred_shading_2.png)
$$
\frac{5}{256} = \frac{I_{max}}{Attenuation}
$$
在这里,![](../img/I_max.png)是光源最亮的颜色分量。我们之所以使用光源最亮的颜色分量是因为解光源最亮的强度值方程最好地反映了理想光体积半径。
在这里,\(I_{max}\)是光源最亮的颜色分量。我们之所以使用光源最亮的颜色分量是因为解光源最亮的强度值方程最好地反映了理想光体积半径。
从这里我们继续解方程:
![](../img/deferred_shading_3.png)
$$
\frac{5}{256} * Attenuation = I_{max}
$$
![](../img/deferred_shading_4.png)
$$
5 * Attenuation = I_{max} * 256
$$
![](../img/deferred_shading_5.png)
$$
Attenuation = I_{max} * \frac{256}{5}
$$
![](../img/deferred_shading_6.png)
$$
K_c + K_l * d + K_q * d^2 = I_{max} * \frac{256}{5}
$$
![](../img/deferred_shading_7.png)
$$
K_q * d^2 + K_l * d + K_c - I_{max} * \frac{256}{5} = 0
$$
最后的方程形成了![](../img/quad_formula.png)的形式,我们可以用求根公式来解这个二次方程:
最后的方程形成了\(ax^2 + bx + c = 0\)的形式,我们可以用求根公式来解这个二次方程:
![](../img/deferred_shading_8.png)
$$
x = \frac{-K_l + \sqrt{K_l^2 - 4 * K_q * (K_c - I_{max} * \frac{256}{5})}}{2 * K_q}
$$
它给我们了一个通用公式从而允许我们计算x的值,即光源的光体积半径,只要我们提供了一个常量,线性和二次项参数:
它给我们了一个通用公式从而允许我们计算\(x\)的值,即光源的光体积半径,只要我们提供了一个常量,线性和二次项参数:
```c++
GLfloat constant = 1.0;