From ead36d51743a5ca31ab26d86b85990a47a58891f Mon Sep 17 00:00:00 2001 From: SuperAo Date: Thu, 25 Apr 2024 14:10:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=20docs/04=20Advanced=20OpenG?= =?UTF-8?q?L/05=20Framebuffers.md=EF=BC=8C=E8=A1=A5=E5=85=A8=E7=BB=83?= =?UTF-8?q?=E4=B9=A0=E9=83=A8=E5=88=86=E7=AD=89=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/04 Advanced OpenGL/05 Framebuffers.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/04 Advanced OpenGL/05 Framebuffers.md b/docs/04 Advanced OpenGL/05 Framebuffers.md index 58a1d0f..1f46be1 100644 --- a/docs/04 Advanced OpenGL/05 Framebuffers.md +++ b/docs/04 Advanced OpenGL/05 Framebuffers.md @@ -4,11 +4,11 @@ ---|--- 作者 | JoeyDeVries 翻译 | Krasjet -校对 | 暂未校对 +校对 | [AoZhang](https://github.com/SuperAoao) -到目前为止,我们已经使用了很多屏幕缓冲了:用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在内存中。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。 +到目前为止,我们已经使用了很多屏幕缓冲了:用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在GPU内存中的某处。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。 -我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。有了我们自己的帧缓冲,我们就能够有更多方式来渲染了。 +我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。通过创建我们自己的帧缓冲,我们可以获得额外的渲染目标(target)。 你可能不能很快理解帧缓冲的应用,但渲染你的场景到不同的帧缓冲能够让我们在场景中加入类似镜子的东西,或者做出很酷的后期处理效果。首先我们会讨论它是如何工作的,之后我们将来实现这些炫酷的后期处理效果。 @@ -34,7 +34,7 @@ glBindFramebuffer(GL_FRAMEBUFFER, fbo); - 附加至少一个缓冲(颜色、深度或模板缓冲)。 - 至少有一个颜色附件(Attachment)。 - 所有的附件都必须是完整的(保留了内存)。 -- 每个缓冲都应该有相同的样本数。 +- 每个缓冲都应该有相同的样本数(sample)。 如果你不知道什么是样本,不要担心,我们将在[之后的](11 Anti Aliasing.md)教程中讲到。 @@ -437,4 +437,9 @@ $$ !!! note "译注" - 注意,核在对屏幕纹理的边缘进行采样的时候,由于还会对中心像素周围的8个像素进行采样,其实会取到纹理之外的像素。由于环绕方式默认是GL_REPEAT,所以在没有设置的情况下取到的是屏幕另一边的像素,而另一边的像素本不应该对中心像素产生影响,这就可能会在屏幕边缘产生很奇怪的条纹。为了消除这一问题,我们可以将屏幕纹理的环绕方式都设置为GL_CLAMP_TO_EDGE。这样子在取到纹理外的像素时,就能够重复边缘的像素来更精确地估计最终的值了。 \ No newline at end of file + 注意,核在对屏幕纹理的边缘进行采样的时候,由于还会对中心像素周围的8个像素进行采样,其实会取到纹理之外的像素。由于环绕方式默认是GL_REPEAT,所以在没有设置的情况下取到的是屏幕另一边的像素,而另一边的像素本不应该对中心像素产生影响,这就可能会在屏幕边缘产生很奇怪的条纹。为了消除这一问题,我们可以将屏幕纹理的环绕方式都设置为GL_CLAMP_TO_EDGE。这样子在取到纹理外的像素时,就能够重复边缘的像素来更精确地估计最终的值了。 + +## 练习 + +- 你能使用framebuffers创建一个后视镜吗?为此,你必须绘制两次场景:一次将相机旋转180度,另一次将相机正常旋转。试着在屏幕顶部创建一个小的四边形来应用镜像纹理,就像[这样](https://learnopengl.com/img/advanced/framebuffers_mirror.png);[解决方案](https://learnopengl.com/code_viewer_gh.php?code=src/4.advanced_opengl/5.2.framebuffers_exercise1/framebuffers_exercise1.cpp)。 +- 摆弄内核值并创建您自己感兴趣的后处理效果。尝试在互联网上搜索其他有趣的内核。 \ No newline at end of file