-2

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

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

提供带注释的示例代码。

4

1 回答 1

1

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

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

简而言之,帧摊销渲染(使用在先前帧中计算的值来完成算法)可以在 OpenGL 中完成,但是如果您尝试使用窗口系统的实际前/后缓冲区(例如WGL、glX、CGL、EGL) 使用。你需要做的很简单,加入一个 FBO 并自己管理一个 FBO 的交换链。不幸的是,这会增加内存需求,但这是大多数现代图形引擎进行摊销的方式。

您需要自己查找 FBO,我解释了理论,这就是您所期望的(供将来参考),因为问题不包含任何代码。

于 2013-10-10T21:51:03.960 回答