Android OpenGLES渲染到纹理

时间:2009-11-11 17:21:29

标签: android opengl-es render-to-texture

我为iPhone编写图形应用程序,我希望将最新的应用程序“Layers”移植到Android平台。图层是绘画应用程序,允许用户在屏幕上绘图,并创建具有不同画笔,颜色等的多层绘画......并导出到PSD。它有桌面同步,涂抹工具,很多好东西...... http://www.layersforiphone.com/

我周一开始关注Android平台,但我遇到了一个重大问题。我使用OpenGL来完成所有绘图,因为它提供了最佳性能。但是,有几个地方我需要渲染到纹理然后使用纹理。例如:

  1. 使用画笔纹理和一行精灵在纹理A
  2. 中创建黑色绘画描边
  3. 将画笔颜色+ alpha放在glColor4f中,然后将纹理A绘制到屏幕上。
  4. 在iPhone上,当用户的手指移动时,我会不断地这样做,并且我可以在第一代iPod Touch上实现12-15fps。这是必要的,因为将颜色和alpha应用于构成画笔笔划的各个精灵不会产生正确的结果(因为精灵重叠并使笔画太暗)。

    android平台支持OpenGL ES 1.0,但似乎省略了处理framebuffers的关键功能。我找不到一种方法将纹理绑定到帧缓冲区并使用OpenGL绘制到它中。

    以下是我通常会在iPhone上进行的操作:

    // generate a secondary framebuffer and bind it to OpenGL so we don't mess with existing output.
    glGenFramebuffers(1, &compositingFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, compositingFramebuffer);
    
    // attach a texture to the framebuffer.
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    
    // subsequent drawing operations are rendered into the texture
    
    // restore the primary framebuffer and (possibly) draw the rendered texture
    glBindFramebuffer(GL_FRAMEBUFFER, originalActiveFramebuffer);
    

    Android平台上有这样的东西吗?在iPhone上,OpenGL比基于软件的绘图快得多,并且是唯一可行的解​​决方案(相信我 - 我也写了一个CoreGraphics绘画应用程序......)。也许我可以在Android上使用另一条路线?我愿意跳过任何必要的箍,但我不会发布应用程序,除非性能(10fps +,因为你在屏幕上绘图)。

1 个答案:

答案 0 :(得分:7)

我怀疑所有Android设备都支持完全相同的OpenGL ES扩展集,或者他们都支持相同版本的OpenGL ES。

Framebuffer对象(FBO)是OpenGL ES 2.0核心规范的一部分;如果您的Android设备支持ES 2.0,那么它支持FBO。

如果您的Android设备支持ES 1.1,请使用 glGetString(GL_EXTENSIONS)检查 GL_OES_framebuffer_object 的扩展字符串。