Learn OpenGL 笔记5.11 Anti Aliasing(抗锯齿)
在Learn OpenGL笔记的5.11 Anti Aliasing(抗锯齿)部分,主要讨论了如何使用多重采样帧缓冲区来解决渲染中的锯齿问题。以下是对该部分内容的详细解析和总结:
1. 多重采样帧缓冲区
多重采样是一种在渲染过程中对每个像素进行多次采样的技术,以减少锯齿效应。通过将图像渲染到一个特殊的帧缓冲区(多采样帧缓冲区),然后将其解析(blit)到普通的帧缓冲区中,可以有效地减少锯齿。
2. 配置多重采样帧缓冲区
2.1 创建多采样帧缓冲区
首先,需要创建一个多采样帧缓冲区:
unsigned int CreateFBOWithMultiSampledAttachments() { unsigned int fbo; glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); // 添加多采样颜色附件 unsigned int msColorBuffer; glGenTextures(1, &msColorBuffer); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, msColorBuffer); glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, width, height, GL_FALSE); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, msColorBuffer, 0); // 添加多采样深度和模板附件 unsigned int rbo; glGenRenderbuffers(1, &rbo); glBindRenderbuffer(GL_RENDERBUFFER, rbo); glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, width, height); glBindRenderbuffer(GL_RENDERBUFFER, 0); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl; glBindFramebuffer(GL_FRAMEBUFFER, 0); return fbo; } 2.2 绘制到多采样帧缓冲区
在绘制时,将帧缓冲区绑定为多采样帧缓冲区:
glBindFramebuffer(GL_FRAMEBUFFER, msFBO); ClearFrameBuffer(); DrawScene(); 3. 解析多采样帧缓冲区
渲染完成后,使用 glBlitFramebuffer 将多采样缓冲区解析到普通的帧缓冲区中:
glBindFramebuffer(GL_READ_FRAMEBUFFER, msFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 4. 后期处理
如果需要对多采样渲染的图像进行后期处理,可以将解析后的普通帧缓冲区绑定到 GL_READ_FRAMEBUFFER,然后使用另一个普通的帧缓冲区进行后处理:
glBindFramebuffer(GL_READ_FRAMEBUFFER, msFBO); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, intermediateFBO); glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); // 使用解析后的普通帧缓冲区进行后期处理 glBindFramebuffer(GL_FRAMEBUFFER, 0); ClearFramebuffer(); glBindTexture(GL_TEXTURE_2D, screenTexture); DrawPostProcessingQuad(); 总结
通过使用多重采样帧缓冲区,可以在渲染过程中对每个像素进行多次采样,从而减少锯齿效应。绘制到多采样帧缓冲区后,使用 glBlitFramebuffer 将其解析到普通的帧缓冲区中,可以有效地减少锯齿。如果需要后期处理,可以将解析后的普通帧缓冲区绑定到 GL_READ_FRAMEBUFFER,然后使用另一个普通的帧缓冲区进行后处理。