4

在 Android NDK 中,是否可以使 OpenGL ES 1.1 与典型的 java 端 GLSurfaceView 模式(覆盖 GLSurfaceView.Renderer onDrawFrame、onSurfaceCreated 等的方法)一起工作,同时在 C++ 端使用帧、颜色和深度缓冲区,以及伊布?

我正在尝试使用以下方法创建它们:

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 组件的关系是什么。

4

1 回答 1

6

绝对没错。标准方法是您创建一个GLSurfaceView与从 Java 中使用 OpenGL 时一样的方法,创建并连接您的GLSurfaceView.Renderer实现,然后启动渲染线程。

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

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

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

当然还有更复杂的设置,您可以在其中创建自己的 OpenGL 上下文,显式地将它们设为当前等。但我强烈建议您坚持使用上述简单方法,除非您有充分的理由需要更多内容。对于大多数标准的 OpenGL 渲染,我所描述的应该是完全足够的。

于 2014-06-27T05:55:35.920 回答