在Android ndk上的OpenGLES 1.1中使用GLSurfaceView模式的FrameBuffers

时间:2014-06-26 16:36:21

标签: c++ opengl-es android-ndk glsurfaceview native-activity

在Android NDK中,是否有可能使OpenGL ES 1.1与典型的Java端GLSurfaceView模式(GLSurfaceView.Renderer onDrawFrame,onSurfaceCreated等的覆盖方法)一起工作,同时在C ++端使用框架,颜色和深度缓冲区和VBO?

我正在尝试使用它创建它们:

void ES1Renderer::on_surface_created() {
    // Create default framebuffer object. The backing will be allocated for the current layer in -resizeFromLayer
    glGenFramebuffersOES(1, &defaultFramebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);

    // Create color renderbuffer object.
    glGenRenderbuffersOES(1, &colorRenderbuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, colorRenderbuffer);

    // create depth renderbuffer object.
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}

但是,似乎这没有得到适当的上下文,我认为这是在初始化GLSurfaceView和渲染器时创建的(java端)。

我不是NDK和OpenGLES的专家,但我必须移植使用OpenGL ES 1.1的iOS应用程序,我的目标是尽可能多地重用代码。由于应用程序还在利用特定于平台的UI组件(按钮,列表等),同时绘制GL图形,我认为这将是最好的方法。但是,我现在正在考虑使用本机活动,但我不确定与其他java组件的关系是什么。

1 个答案:

答案 0 :(得分:6)

当然,是的。标准方法是创建一个GLSurfaceView,就像从Java使用OpenGL一样,创建并连接GLSurfaceView.Renderer实现,并让渲染线程启动。

通过Renderer方法,例如onSurfaceCreated()onDrawFrame(),您现在可以调用调用本机代码中的函数的JNI函数。在这些本机函数中,您可以根据自己的需要进行任何OpenGL API调用。例如,在您从onSurfaceCreated()调用的函数中,您可能会创建一些对象并设置一些初始状态。在您从onSurfaceChanged()调用的函数中,您可以设置视口和投影。在您从onDrawFrame()调用的函数中,您可以进行渲染。

您甚至可以使用Java和本机代码进行OpenGL调用。 Java OpenGL API只是本机函数的一个非常薄的层。如果从本机代码或通过Java API调用函数,则没有什么区别。

您唯一需要注意的是,您调用所有您的本机代码,该代码通过GLSurfaceView.Renderer onSurfaceCreated() onSurfaceChanged()实现进行OpenGL API调用,{{1 }和onDrawFrame()。调用这些方法时,您处于渲染线程中,并具有当前的OpenGL上下文。如果从其他任何地方调用本机OpenGL代码,则可能是您在错误的线程中和/或您没有当前的OpenGL上下文。

当然有更复杂的设置,你可以创建自己的OpenGL上下文,明确表示它们等等。但我强烈建议坚持上面的简单方法,除非你有一个很好的理由为什么你需要更多东西。对于大多数标准的OpenGL渲染,我所描述的应该是完全足够的。