OpenGL ES 3.0 中的多重采样 FBO

Multisampled FBO's in OpenGL ES 3.0

如何在 OpenGL ES 3.0 (Android) 中将多重采样纹理作为 FBO 的一部分?

方法glTexImage2DMultisample似乎不​​存在。

我还想稍后在此代码中对该纹理调用 glReadPixels, 所以多重采样纹理也应该是可读的。

为此我需要使用某种扩展程序或实用程序吗?

你想要glTexStorage2DMultisample。一般来说,将多重采样数据写回内存是很昂贵的,并且需要使用 glBlitFramebuffer 进行解析以合并为单个样本。

考虑使用此扩展在大多数基于图块的架构上获得 "free" 解析。

https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture.txt

实际上,opengl es不支持纹理多重采样,glTexStorage2DMultisample不适用于纹理多重采样。 opengl es 只支持多重采样的渲染缓冲区,在我的例子中,我通过创建一个渲染缓冲区来解决多重采样,很有魅力。

我是怎么做到的:

glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
    LOGI("ERROR::FRAMEBUFFER:: Framebuffer is not complete!");
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);

然后渲染:

 glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
 glBlitFramebuffer(0, 0, mScreenWidth, mScreenHeight, 0, 0, mScreenWidth, mScreenHeight,
                      GL_COLOR_BUFFER_BIT, GL_NEAREST);

这适用于 opengl es 3.2,Android 平台。