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 平台。
如何在 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 平台。