保留和组合渲染像素

时间:2013-10-10 14:05:18

标签: opengl sdl

注意:在我的OpenGL项目中,我启用了SDL_GL_SwapBuffers,就像这样SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1)

如何在调用SDL_GL_SwapBuffers()后保留像素,以便重新使用渲染的像素而不必再次渲染它们,并且如何将保留的像素组合为背景图层,使用{{清除缓冲区1}}并在背景图层顶部渲染多边形?

提供评论的示例代码。

1 个答案:

答案 0 :(得分:1)

从技术上讲,您可以根据所选择的交换方法获取后备缓冲区的旧内容。这是一个完全黑客,但它可以工作。如果是交换,如果再次交换缓冲区而不清除颜色缓冲区,则可能在后备缓冲区中有前缓冲区的旧副本。如果您的交换方法是复制,那么除非您自己发出glClear (...),否则不应清除您的后备缓冲区。请注意,因为如果您在交换后尝试读取它们,则存在第三个常见的交换选项,它会使缓冲区的内容不确定。

我提到的最后一次交换行为在嵌入式图形设备上很常见,比如PowerVR(iOS)。桌面上没有那么多。这一切都假设OpenGL的窗口系统实现使用1个前缓冲和1个后备缓冲,这让我回到这是一个完全黑客的声明。在幕后实现可以实现三重缓冲,并且大多数窗口系统API甚至不提供请求反向缓冲区数量的方法,更不用说查询它了。交换链在GL世界中是令人讨厌的东西: - \

简而言之, 帧分摊渲染 (使用先前帧中计算的值来完成算法)可以在OpenGL中完成,但是如果你只会让生活变得更加困难尝试使用窗口系统(例如WGL,glX,CGL,EGL)使用的实际前/后缓冲器。你需要做的很简单,吸引FBO并自己管理FBO的交换链。遗憾的是,这会增加内存需求,但这是大多数现代图形引擎进行摊销的方式。

你需要自己查找这个FBO,我解释了理论,这是你所能期待的(以备将来参考),因为这个问题没有包含任何代码。