对于每个传入的tweet,我被要求在世界地图(opengl场景)上放置一个点(对应于tweet位置)。像这样的东西。我试着学习OpenGL。我哭了。随着时间的推移,OpenGL开始像我的朋友一样。他即将成为我最好的朋友。现在,我在Android上使用GLSurfaceView
,并假设我可以简单地一个接一个地绘制点,一个接一个地绘制点,而无需调用glCear()
。这样,我只需要保持当前的推文坐标在内存中。告诉自己,你是个天才。我像其他人一样受苦,他们解释了这里,这里和这里的痛苦。现在来了一个大师,他教我基本的,告诉我,孩子,你必须叫glClear
无论如何。
我不能继续在内存中添加/存储所有点的坐标并调用glDrawArrarys
,因为这必须在移动设备上一直运行。现在的选项是
- 绘制
n
点。之后,尝试"渲染到纹理",并使用该纹理作为下一个n
点的下一个绘图的背景。 - 在Mali sdk中使用EGL保存样本中的
EGL_BUFFER_PRESERVED
。需要NDK,因为AndroidEGL14
不能在Android API 17之前使用。Khronos EGL11尚未在Android上实现。我的新朋友最亲近的人告诉我,他根本不喜欢这样。
我还有其他选择吗?还是我解决错了问题?我想知道什么是OpenGL的方法来永远更新一个场景。
我相信并非所有设备都支持EGL_BUFFER_PRESERVED
。因此,即使你可以使用API级别17,那也可能不是你的解决方案。
你可以使用FBO对纹理进行主要渲染。在你完成设置FBO之后,当你初始化整个事物时,你会清除纹理一次。然后,每次你得到一个新的点,你把它绘制到纹理,然后把纹理复制到主帧缓冲区。
大致来说,在启动时有以下步骤:
- 创建纹理,并设置所需的格式/大小,参数等
- 创建FBO,并设置纹理为颜色附件
- 准备渲染到FBO,调用
glViewport()
等 - 呼叫
glClear()
.
每次添加一个点:
- 将新点传递到
Renderer
实现中,并触发重绘。 - 在
onDrawFrame()
中,绑定FBO进行渲染。 - 渲染点 为渲染绑定默认的framebuffer。
- 为简单的纹理绑定着色程序
- 为采样绑定纹理。
- 绘制屏幕填充四边形
现在来了一个大师,他教我基本的,告诉我,孩子,你必须调用glClear无论什么。
知道什么时候该改变甚至打破这个规则是很重要的。或者如何克服它。主要问题是主帧缓冲区损坏的可能性,这也是为什么您应该从头开始每个帧的原因。主帧缓冲区并不真正"属于"OpenGL,它只是从操作系统借给它。操作系统可以对它做任何它想做的事。
现在有一个简单的方法来解决这个问题:绘制到一个framebuffer中,后面是一个您可以完全控制的图像存储。在OpenGL(-ES)中,这将是一个framebuffer对象。