1
0
mirror of https://github.com/LearnOpenGL-CN/LearnOpenGL-CN.git synced 2025-08-23 12:45:29 +08:00

Fix all the titles

This commit is contained in:
Meow J
2016-07-06 01:39:55 +08:00
parent fd614ffcc4
commit 86dc92e4db
45 changed files with 508 additions and 527 deletions

View File

@@ -8,8 +8,6 @@
到目前为止,我们使用了几种不同类型的屏幕缓冲:用于写入颜色值的颜色缓冲,用于写入深度信息的深度缓冲,以及允许我们基于一些条件丢弃指定片段的模板缓冲。把这几种缓冲结合起来叫做帧缓冲(Framebuffer)它被储存于内存中。OpenGL给了我们自己定义帧缓冲的自由我们可以选择性的定义自己的颜色缓冲、深度和模板缓冲。
[译注1]: http://learnopengl-cn.readthedocs.org "framebuffer在维基百科有framebuffer的详细介绍能够帮助你更好的理解"
我们目前所做的渲染操作都是是在默认的帧缓冲之上进行的。当你创建了你的窗口的时候默认帧缓冲就被创建和配置好了GLFW为我们做了这件事。通过创建我们自己的帧缓冲我们能够获得一种额外的渲染方式。
你也许不能立刻理解应用程序的帧缓冲的含义,通过帧缓冲可以将你的场景渲染到一个不同的帧缓冲中,可以使我们能够在场景中创建镜子这样的效果,或者做出一些炫酷的特效。首先我们会讨论它们是如何工作的,然后我们将利用帧缓冲来实现一些炫酷的效果。
@@ -40,7 +38,7 @@ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
如果你不知道什么是样本也不用担心,我们会在后面的教程中讲到。
从上面的需求中你可以看到,我们需要为帧缓冲创建一些附件,还需要把这些附件附加到帧缓冲上。当我们做完所有上面提到的条件的时候我们就可以用 `glCheckFramebufferStatus` 带上 `GL_FRAMEBUFFER` 这个参数来检查是否真的成功做到了。然后检查当前绑定的帧缓冲,返回了这些规范中的哪个值。如果返回的是 `GL_FRAMEBUFFER_COMPLETE`就对了:
从上面的需求中你可以看到,我们需要为帧缓冲创建一些附件(Attachment),还需要把这些附件附加到帧缓冲上。当我们做完所有上面提到的条件的时候我们就可以用 `glCheckFramebufferStatus` 带上 `GL_FRAMEBUFFER` 这个参数来检查是否真的成功做到了。然后检查当前绑定的帧缓冲,返回了这些规范中的哪个值。如果返回的是 `GL_FRAMEBUFFER_COMPLETE`就对了:
```c++
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
@@ -61,7 +59,7 @@ glDeleteFramebuffers(1, &fbo);
现在在执行完成检测前我们需要把一个或更多的附件附加到帧缓冲上。一个附件就是一个内存地址这个内存地址里面包含一个为帧缓冲准备的缓冲它可以是个图像。当创建一个附件的时候我们有两种方式可以采用纹理或渲染缓冲renderbuffer对象。
## 纹理附件
### 纹理附件
当把一个纹理附加到帧缓冲上的时候,所有渲染命令会写入到纹理上,就像它是一个普通的颜色/深度或者模板缓冲一样。使用纹理的好处是,所有渲染操作的结果都会被储存为一个纹理图像,这样我们就可以简单的在着色器中使用了。
@@ -106,9 +104,9 @@ glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, GL_DEPTH_STENC
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texture, 0);
```
### 渲染缓冲对象附件Renderbuffer object attachments
### 缓冲对象附件
在介绍了帧缓冲的可行附件类型——纹理后OpenGL引进了渲染缓冲对象Renderbuffer objects所以在过去那些美好时光里纹理是附件的唯一可用的类型。和纹理图像一样渲染缓冲对象也是一个缓冲它可以是一堆字节、整数、像素或者其他东西。渲染缓冲对象的一大优点是它以OpenGL原生渲染格式储存它的数据因此在离屏渲染到帧缓冲的时候这些数据就相当于被优化过的了。
在介绍了帧缓冲的可行附件类型——纹理后OpenGL引进了渲染缓冲对象(Renderbuffer objects)所以在过去那些美好时光里纹理是附件的唯一可用的类型。和纹理图像一样渲染缓冲对象也是一个缓冲它可以是一堆字节、整数、像素或者其他东西。渲染缓冲对象的一大优点是它以OpenGL原生渲染格式储存它的数据因此在离屏渲染到帧缓冲的时候这些数据就相当于被优化过的了。
渲染缓冲对象将所有渲染数据直接储存到它们的缓冲里,而不会进行针对特定纹理格式的任何转换,这样它们就成了一种快速可写的存储介质了。然而,渲染缓冲对象通常是只写的,不能修改它们(就像获取纹理,不能写入纹理一样)。可以用`glReadPixels`函数去读取,函数返回一个当前绑定的帧缓冲的特定像素区域,而不是直接返回附件本身。
@@ -280,13 +278,13 @@ glBindVertexArray(0);
然而这有什么好处呢?好处就是我们现在可以自由的获取已经渲染场景中的任何像素,然后把它当作一个纹理图像了,我们可以在片段着色器中创建一些有意思的效果。所有这些有意思的效果统称为后处理特效。
### 后处理
# 后处理
现在,整个场景渲染到了一个单独的纹理上,我们可以创建一些有趣的效果,只要简单操纵纹理数据就能做到。这部分,我们会向你展示一些流行的后处理特效,以及怎样添加一些创造性去创建出你自己的特效。
现在,整个场景渲染到了一个单独的纹理上,我们可以创建一些有趣的效果,只要简单操纵纹理数据就能做到。这部分,我们会向你展示一些流行的后处理(Post-processing)特效,以及怎样添加一些创造性去创建出你自己的特效。
### 反相
我们已经取得了渲染输出的每个颜色所以在片段着色器里返回这些颜色的反色并不难。我们得到屏幕纹理的颜色然后用1.0减去它:
我们已经取得了渲染输出的每个颜色,所以在片段着色器里返回这些颜色的反色(Inversion)并不难。我们得到屏幕纹理的颜色然后用1.0减去它:
```c++
void main()
@@ -326,7 +324,7 @@ void main()
![](http://learnopengl.com/img/advanced/framebuffers_grayscale.png)
### Kernel effects
## Kernel effects
在单独纹理图像上进行后处理的另一个好处是我们可以从纹理的其他部分进行采样。比如我们可以从当前纹理值的周围采样多个纹理值。创造性地把它们结合起来就能创造出有趣的效果了。
@@ -388,9 +386,9 @@ void main()
这里创建的有趣的效果就好像你的玩家吞了某种麻醉剂产生的幻觉一样。
### Blur
### 模糊
创建模糊效果的kernel定义如下
创建模糊(Blur)效果的kernel定义如下
$$
\(\begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{bmatrix} / 16\)
@@ -416,7 +414,7 @@ float kernel[9] = float[](
### 边检测
下面的边检测kernel与锐化kernel类似:
下面的边检测(Edge-detection)kernel与锐化kernel类似:
$$
\begin{bmatrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{bmatrix}