后处理(Post-Processing)
简介:
后处理是在图像渲染的最后阶段对图像进行进一步处理的技术。它通常用于游戏和图形应用中,增强或修改图像的视觉效果。Post-processing处理通常发生在渲染完成后,屏幕上的最终图像会传递给这个阶段进行后续处理。它可以应用于各种效果,如颜色调整、模糊、抗锯齿、辉光、锐化等。
基本流程:
- 渲染完成:首先,场景被渲染到一个离屏缓冲区(FrameBuffer)。这就是我们后续处理的源图像。
- 应用后处理效果:从帧缓冲中提取图像数据后,我们可以在着色器中对它进行处理。
- 将效果应用到最终图像:经过后处理的图像将重新呈现在屏幕上,最终形成用户看到的画面。
帧缓冲对象(Frame Buffer Objects, FBOs)
FBO是一个OpenGL对象,允许你将渲染输出存储到多个纹理中,而不仅仅是传统的前后缓冲区。
FBO包含多个独立的纹理,称为附件,其中存储着颜色、深度和模板信息。你渲染的几何体可以被重定向到这些FBO之一,或者继续渲染到“正常”的渲染目标。你可以将标准的后缓冲区、深度缓冲区和模板缓冲区的组合视为内置的“默认”FBO,始终可用。
每个FBO可能包含可选的深度、模板和颜色组件,但至少需要一个附件——否则它将渲染到哪里呢!OpenGL FBO支持多个渲染目标——也就是说,一个单独的片段着色器可以同时写入多个颜色附件。支持的颜色附件数量取决于图形硬件,但最多可能支持8个独立的附件。那么为什么你需要渲染到多个颜色纹理呢?例如,你可能希望按像素存储场景的法线,以便进行额外的处理,或者将高于某个亮度值的片段写入一个单独的渲染目标,稍后进行模糊处理。这就是FBO多渲染目标的优势——无论你需要什么渲染信息,都可以按像素获取并存储到纹理中。
这些附件实际上只是普通的OpenGL 2D纹理,因此可以像普通纹理一样访问。比如,你可以将一个帧渲染到一个FBO,然后将该FBO的颜色附件作为下一个帧渲染的纹理!不过,附加到FBO的纹理有一些限制:你用作附件的纹理不能是压缩类型,这样做是不可取的,因为压缩和重新压缩像素数据在几何体渲染时会产生额外开销。此外,具体的硬件扩展支持情况不同,所有附件可能需要具有相同的维度。
虽然FBO不支持压缩纹理,但它们支持打包纹理。在使用FBO模拟常规图形管线时,通常会有一个32位颜色附件,提供8位的r、g、b和a通道,以及一个24位的z缓冲区。然而,一些图形硬件要求所有附件具有相同的位深度。一个简单的解决方法是使用32位的z缓冲区,利用其更高的精度。但如果你还想要一个模板附件呢?每个像素32位的模板数据可能过于冗余!这时,纹理打包就派上用场了。通过打包纹理,可以将深度信息和模板信息合并在一个纹理中,深度使用24位,模板使用8位。
附录
(1)前后缓冲区
前后缓冲区是图形渲染中常用的两种缓冲区类型,通常用于双缓冲技术来避免屏幕闪烁现象。
前缓冲区(Front Buffer):是当前显示在屏幕上的图像。
后缓冲区(Back Buffer):是渲染计算的图像,直到渲染完成后才会显示到屏幕上。
在渲染过程中,图形首先被绘制到后缓冲区,当渲染完成后,后缓冲区的内容被交换到前缓冲区,显示给用户,这个过程通常是由硬件进行支持的。
(2)FBO用于渲染的哪个步骤?
FBO主要用于离屏渲染(off-screen rendering)。它允许在不直接显示到屏幕的情况下渲染场景或几何体,并将渲染结果存储到一个或多个纹理中。这个过程通常发生在以下步骤:
创建FBO:通过OpenGL或其他图形API创建一个FBO对象,FBO包含一个或多个附件(纹理或渲染缓冲区),这些附件可以存储颜色、深度、模板等信息。
渲染到FBO:在渲染过程中,将渲染结果定向到FBO的附件中,而不是默认的屏幕缓冲区。
后处理效果:渲染完成后,可以使用FBO存储的纹理进行后续图像处理或作为其他图形渲染阶段的输入。
FBO用于离屏渲染,因此常见于延迟渲染、屏幕空间效果(如反射、阴影、环境光遮蔽等)以及后期处理效果(如模糊、辉光等)。
(3)什么是附件?
附件(attachments)本质上是OpenGL中的纹理(或者渲染缓冲区)。它们不是片元着色器,而是片元着色器的渲染输出目标,片元着色器计算后会将结果输出到这些附件中。
在FBO的上下文中:
片元着色器(Fragment Shader)生成的像素颜色会被写入这些附件中,作为渲染的输出。
比如,片元着色器计算出来的颜色可以写入FBO的颜色附件中,深度值可以写入深度附件中,模板信息可以写入模板附件中。

Leave a comment