1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 04:35: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

@@ -83,7 +83,9 @@ glDepthFunc(GL_ALWAYS);
在深度缓冲区中包含深度值介于`0.0`和`1.0`之间,从观察者看到其内容与场景中的所有对象的 z 值进行了比较。这些视图空间中的 z 值可以在投影平头截体的近平面和远平面之间的任何值。我们因此需要一些方法来转换这些视图空间 z 值到 [01] 的范围内,方法之一就是线性将它们转换为 [01] 范围内。下面的 (线性) 方程把 z 值转换为 0.0 和 1.0 之间的值 :
![](../img/05_01_F_depth.png)
$$
\begin{equation} F_{depth} = \frac{z - near}{far - near} \end{equation}
$$
这里far和near是我们用来提供到投影矩阵设置可见视图截锥的远近值 (见[坐标系](http://learnopengl-cn.readthedocs.org/zh/latest/01%20Getting%20started/08%20Coordinate%20Systems/))。方程带内锥截体的深度值 z并将其转换到 [01] 范围。在下面的图给出 z 值和其相应的深度值的关系:
@@ -97,7 +99,9 @@ glDepthFunc(GL_ALWAYS);
由于非线性函数是和 1/z 成正比例如1.0 和 2.0 之间的 z 值,将变为 1.0 到 0.5之间, 这样在z非常小的时候给了我们很高的精度。50.0 和 100.0 之间的 Z 值将只占 2%的浮点数的精度,这正是我们想要的。这类方程,也需要近和远距离考虑,下面给出:
![](../img/05_01_F_depth_nonliner.png)
$$
\begin{equation} F_{depth} = \frac{1/z - 1/near}{1/far - 1/near} \end{equation}
$$
如果你不知道这个方程到底怎么回事也不必担心。要记住的重要一点是在深度缓冲区的值不是线性的屏幕空间 (它们在视图空间投影矩阵应用之前是线性)。值为 0.5 在深度缓冲区并不意味着该对象的 z 值是投影平头截体的中间;顶点的 z 值是实际上相当接近近平面!你可以看到 z 值和产生深度缓冲区的值在下列图中的非线性关系:

View File

@@ -130,12 +130,14 @@ glEnable(GL_BLEND);
OpenGL以下面的方程进行混合
C¯result = C¯source Fsource + C¯destination Fdestination
$$
\begin{equation}\bar{C}_{result} = \bar{\color{green}C}_{source} * \color{green}F_{source} + \bar{\color{red}C}_{destination} * \color{red}F_{destination}\end{equation}
$$
* source源颜色向量。这是来自纹理的本来的颜色向量。
* destination目标颜色向量。这是储存在颜色缓冲中当前位置的颜色向量。
* Fsource源因子。设置了对源颜色的alpha值影响。
* Fdestination目标因子。设置了对目标颜色的alpha影响。
* \(\bar{\color{green}C}_{source}\):源颜色向量。这是来自纹理的本来的颜色向量。
* \(\bar{\color{red}C}_{destination}\):目标颜色向量。这是储存在颜色缓冲中当前位置的颜色向量。
* \(\color{green}F_{source}\)源因子。设置了对源颜色的alpha值影响。
* \(\color{red}F_{destination}\)目标因子。设置了对目标颜色的alpha影响。
片段着色器运行完成并且所有的测试都通过以后混合方程才能自由执行片段的颜色输出当前它在颜色缓冲中前面片段的颜色在当前片段之前储存。源和目标颜色会自动被OpenGL设置而源和目标因子可以让我们自由设置。我们来看一个简单的例子
@@ -143,9 +145,11 @@ C¯result = C¯source Fsource + C¯destination Fdestination
我们有两个方块,我们希望在红色方块上绘制绿色方块。红色方块会成为源颜色(它会先进入颜色缓冲),我们将在红色方块上绘制绿色方块。
那么问题来了我们怎样来设置因子呢我们起码要把绿色方块乘以它的alpha值所以我们打算把Fsource设置为源颜色向量的alpha值0.6。接着让目标方块的浓度等于剩下的alpha值。如果最终的颜色中绿色方块的浓度为60%我们就把红色的浓度设为40%1.0 0.6)。所以我们把Fdestination设置为1减去源颜色向量的alpha值。方程将变成
那么问题来了我们怎样来设置因子呢我们起码要把绿色方块乘以它的alpha值所以我们打算把\(F_{src}\)设置为源颜色向量的alpha值0.6。接着让目标方块的浓度等于剩下的alpha值。如果最终的颜色中绿色方块的浓度为60%我们就把红色的浓度设为40%1.0 0.6)。所以我们把\(F_{destination}\)设置为1减去源颜色向量的alpha值。方程将变成
![](../img/blending_C_result.png)
$$
\begin{equation}\bar{C}_{result} = \begin{pmatrix} \color{red}{0.0} \\ \color{green}{1.0} \\ \color{blue}{0.0} \\ \color{purple}{0.6} \end{pmatrix} * \color{green}{0.6} + \begin{pmatrix} \color{red}{1.0} \\ \color{green}{0.0} \\ \color{blue}{0.0} \\ \color{purple}{1.0} \end{pmatrix} * \color{red}{(1 - 0.6)} \end{equation}
$$
最终方块结合部分包含了60%的绿色和40%的红色,得到一种脏兮兮的颜色:
@@ -155,27 +159,27 @@ C¯result = C¯source Fsource + C¯destination Fdestination
这个方案不错但我们怎样告诉OpenGL来使用这样的因子呢恰好有一个叫做`glBlendFunc`的函数。
`void glBlendFunc(GLenum sfactor, GLenum dfactor)`接收两个参数来设置源source和目标destination因子。OpenGL为我们定义了很多选项我们把最常用的列在下面。注意颜色常数向量constant可以用`glBlendColor`函数分开来设置。
`void glBlendFunc(GLenum sfactor, GLenum dfactor)`接收两个参数来设置源source和目标destination因子。OpenGL为我们定义了很多选项我们把最常用的列在下面。注意颜色常数向量\(\bar{\color{blue}C}_{constant}\)可以用`glBlendColor`函数分开来设置。
Option | Value
选项 | 值
---|---
GL_ZERO | 0
GL_ONE | 1
GL_SRC_COLOR | 颜色source.
GL_ONE_MINUS_SRC_COLOR | 1 source.
GL_DST_COLOR | destination
GL_ONE_MINUS_DST_COLOR | 1 destination.
GL_SRC_ALPHA | C¯source的alpha值
GL_ONE_MINUS_SRC_ALPHA | 1 - C¯source的alpha值
GL_DST_ALPHA | destinationalpha值
GL_ONE_MINUS_DST_ALPHA | 1 -destinationalpha值
GL_CONSTANT_COLOR | constant.
GL_ONE_MINUS_CONSTANT_COLOR | 1 - constant
GL_CONSTANT_ALPHA | constantalpha值
GL_ONE_MINUS_CONSTANT_ALPHA | 1 constantalpha值
GL_ZERO | \(0\)
GL_ONE | \(1\)
GL_SRC_COLOR | 颜色向量\(\bar{\color{green}C}_{source}\)
GL_ONE_MINUS_SRC_COLOR | \(1 - \bar{\color{green}C}_{source}\)
GL_DST_COLOR | 目标颜色向量\(\bar{\color{red}C}_{destination}\)
GL_ONE_MINUS_DST_COLOR | \(1 - \bar{\color{red}C}_{destination}\)
GL_SRC_ALPHA | \(\bar{\color{green}C}_{source}\)的\(alpha\)
GL_ONE_MINUS_SRC_ALPHA | \(1 -\) \(\bar{\color{green}C}_{source}\)的\(alpha\)
GL_DST_ALPHA | \(\bar{\color{red}C}_{destination}\)的\(alpha\)
GL_ONE_MINUS_DST_ALPHA | \(1 -\) \(\bar{\color{red}C}_{destination}\)的\(alpha\)
GL_CONSTANT_COLOR | 常颜色向量\(\bar{\color{blue}C}_{constant}\)
GL_ONE_MINUS_CONSTANT_COLOR | \(1 - \bar{\color{blue}C}_{constant}\)
GL_CONSTANT_ALPHA | \(\bar{\color{blue}C}_{constant}\)的\(alpha\)
GL_ONE_MINUS_CONSTANT_ALPHA | \(1 -\) \(\bar{\color{blue}C}_{constant}\)的\(alpha\)
为从两个方块获得混合结果我们打算把源颜色的alpha给源因子1-alpha给目标因子。调整到`glBlendFunc`之后就像这样:
为从两个方块获得混合结果,我们打算把源颜色的\(alpha\)给源因子,\(1 - alpha\)给目标因子。调整到`glBlendFunc`之后就像这样:
```c++
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -193,9 +197,9 @@ OpenGL给了我们更多的自由我们可以改变方程源和目标部分
`void glBlendEquation(GLenum mode)`允许我们设置这个操作有3种可行的选项
* GL_FUNC_ADD默认的彼此元素相加result = Src + Dst.
* GL_FUNC_SUBTRACT彼此元素相减 result = Src Dst.
* GL_FUNC_REVERSE_SUBTRACT彼此元素相减但顺序相反result = Dst Src.
* GL_FUNC_ADD默认的彼此元素相加\(\bar{C}_{result} = \color{green}{Src} + \color{red}{Dst}\)
* GL_FUNC_SUBTRACT彼此元素相减 \(\bar{C}_{result} = \color{green}{Src} - \color{red}{Dst}\)
* GL_FUNC_REVERSE_SUBTRACT彼此元素相减但顺序相反\(\bar{C}_{result} = \color{red}{Dst} - \color{green}{Src}\).
通常我们可以简单地省略`glBlendEquation`因为GL_FUNC_ADD在大多数时候就是我们想要的但是如果你如果你真想尝试努力打破主流常规其他的方程或许符合你的要求。

View File

@@ -332,7 +332,9 @@ void main()
kernel是一个长得有点像一个小矩阵的数值数组它中间的值中心可以映射到一个像素上这个像素和这个像素周围的值再乘以kernel最后再把结果相加就能得到一个值。所以我们基本上就是给当前纹理坐标加上一个它四周的偏移量然后基于kernel把它们结合起来。下面是一个kernel的例子
![](http://learnopengl-cn.readthedocs.org/zh/latest/img/05_05framebuffers_ kernel_sample.png)
$$
\begin{bmatrix}2 & 2 & 2 \\ 2 & -15 & 2 \\ 2 & 2 & 2 \end{bmatrix}
$$
这个kernel表示一个像素周围八个像素乘以2它自己乘以-15。这个例子基本上就是把周围像素乘上2中间像素去乘以一个比较大的负数来进行平衡。
@@ -390,7 +392,7 @@ void main()
创建模糊效果的kernel定义如下
![](http://learnopengl-cn.readthedocs.org/zh/latest/img/05_05_blur_sample.png)
\(\begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{bmatrix} / 16\)
由于所有数值加起来的总和为16,简单返回结合起来的采样颜色是非常亮的,所以我们必须将kernel的每个值除以16.最终的kernel数组会是这样的:
@@ -414,7 +416,9 @@ float kernel[9] = float[](
下面的边检测kernel与锐化kernel类似:
![](http://learnopengl-cn.readthedocs.org/zh/latest/img/05_05_Edge_detection.png)
$$
\begin{bmatrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{bmatrix}
$$
这个kernel将所有的边提高亮度,而对其他部分进行暗化处理,当我们值关心一副图像的边缘的时候,它非常有用.