【问题标题】:FrameBuffers with GLSurfaceView pattern in OpenGLES 1.1 on android ndkandroid ndk 上 OpenGLES 1.1 中具有 GLSurfaceView 模式的 FrameBuffers
【发布时间】:2014-08-17 14:55:19
【问题描述】:

在 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 组件的关系。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多