我正在Android和本地C++中实现一个场景绘制,使用EGL 1.1在Android上进行。目前使用Android的
我的问题是:我需要能够显示后缓冲区并继续编写,就好像我没有交换一样。这个需求背后的原因是场景非常大,每帧都要构建不可能,等待绘制结束也不行-因为用户将不得不等待太长时间。
换句话说-我需要逐步构建场景。
在渲染过程中的某个特定点上,我决定是时候调用
据我所见,我唯一的选择是在交换之前复制后缓冲区。伪代码如下:
glSurfaceView
- 它允许我绘制到后缓冲区,该缓冲区在“onDrawFrame”结束时显示,当交换后缓冲区和前缓冲区时。我的问题是:我需要能够显示后缓冲区并继续编写,就好像我没有交换一样。这个需求背后的原因是场景非常大,每帧都要构建不可能,等待绘制结束也不行-因为用户将不得不等待太长时间。
换句话说-我需要逐步构建场景。
在渲染过程中的某个特定点上,我决定是时候调用
eglSwapBuffers
了,它会显示从后缓冲区绘制的内容,但当我继续编写时,我显然正在写入“前面的缓冲区”,它已经失去同步...(不包含我到目前为止绘制的东西)。据我所见,我唯一的选择是在交换之前复制后缓冲区。伪代码如下:
- 绘制到后备缓冲区
- 复制后备缓冲区到临时缓冲区
- 交换
- 复制临时缓冲区到(新的)后备缓冲区
- 在后备缓冲区中绘制更多内容
- 等等...
有没有方法可以完成步骤2和4?
glCopyPixels
在这种情况下有用吗? 例如?glBlitFramebuffer
?
还是我的方法不对?
我已经做的事情:
我尝试将
EGL_SWAP_BEHAVIOR
设置为EGL_BUFFER_PRESERVED
,但似乎只在某些设备上起作用(如khronos notes所述):有些表面允许应用程序控制是否保留颜色缓冲区内容
每帧重新渲染场景-不可能。 我已经多次阅读到这是推荐的做法。
glBlitFramebuffer
,或者如果你附加了纹理而不是渲染缓冲区,你只需使用该纹理应用于全屏四边形进行渲染。 - derhass