Android Opengl FBO 屏幕外

Posted

技术标签:

【中文标题】Android Opengl FBO 屏幕外【英文标题】:Android Opengl FBO offscreen 【发布时间】:2013-01-17 14:55:57 【问题描述】:

我正在开发一个 android 应用程序类型的手指画。我正在使用 OpenGL ES 2.0。基本上我有一个图像,其中每个触摸屏都应对应于要应用的圆形 alpha,它显示位于下方的另一个图像。我尝试了不同的技术,但速度相当慢,因为它的功能就像使用有机 glTexSubImage2D 一样会减慢渲染阶段。我试图了解 FBO 的使用,因为它们允许离屏渲染。有人可以更好地解释一下渲染离屏意味着什么,以及可以获得哪些优势来加快我的方法?

我想离屏意味着你可以改变我创建的帧缓冲区,不影响onDrawFrame?在另一个线程中?

【问题讨论】:

【参考方案1】:

除了能够使用 OpenGL 渲染到屏幕窗口之外 ES 2.0,您还可以渲染到不可见的屏幕外表面,称为 pbuffers(像素缓冲区的缩写)。 Pbuffers 可以充分利用任何硬件 OpenGL ES 2.0 可以使用加速,就像窗口一样。 Pbuffers 最常用于生成纹理贴图。如果你想要 做的是渲染到纹理,我们推荐使用帧缓冲对象(覆盖 在第 12 章,“帧缓冲区对象”中)而不是 pbuffers,因为它们是 更高效。但是,pbuffers 在某些情况下仍然有用 无法使用帧缓冲区对象,例如在渲染离屏时 使用 OpenGL ES 绘制表面,然后将其用作另一个 API 中的纹理,例如 作为 OpenVG。

[来源:OpenGL ES 2.0 编程指南]

我希望这会有所帮助。请仔细阅读 - “pbuffers 仍然可以用于使用 OpenGL ES 渲染到屏幕外表面”

【讨论】:

但是,我看到有人提到 pbuffer 方法在 Android 上很慢,因为需要在两个 EGL 上下文之间切换。相反,搜索使用“帧缓冲区对象”作为屏幕外缓冲区的 *** 答案。【参考方案2】:

您的方法占用了大量内存带宽,因为您需要读回(部分)屏幕并将相同数量的数据再次写回 GPU 内存。这真的很慢,并且使您的绘图代码在图像被移回 GPU 之前等待渲染。您是否考虑过为每个手指按压绘制四边形或某种近似您需要的图元?为什么需要 OpenGL?

【讨论】:

以上是关于Android Opengl FBO 屏幕外的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 FBO 进行多重采样时,OpenGL 会使我的场景变亮?

Android OpenGL 1.1 FBO 和 VBO 支持

OpenGL:如何设置 OpenGL 只渲染到 FBO,不输出到屏幕/窗口/控件?

OpenGL 帧缓冲区 + LibGDX

OpenGL:渲染到 FBO 时是不是支持纹理组合器功能?

从纹理渲染到屏幕外纹理 (FBO)