在 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 应用程序,并且我的目标是尽可能多地重用代码。由于该应用程序在绘制 GL 图形时还利用了特定于平台的 UI 组件(按钮、列表等),因此我认为这将是最好的方法。然而,我现在正在考虑使用本机活动,尽管我不确定与其他 java 组件的关系是什么。
绝对没错。标准方法是您创建一个GLSurfaceView
就像您在 Java 中使用 OpenGL 一样,创建并连接您的GLSurfaceView.Renderer
实现,并让渲染线程启动。
从你的Renderer
方法,例如onSurfaceCreated()
and onDrawFrame()
,您现在可以调用 JNI 函数来调用本机代码中的函数。在这些本机函数中,您可以根据需要进行任何 OpenGL API 调用。例如,在您调用的函数中onSurfaceCreated()
您可以创建一些对象并设置一些初始状态。在您调用的函数中onSurfaceChanged()
,您可以设置视口和投影。在您调用的函数中onDrawFrame()
,您进行渲染。
您甚至可以从 Java 和本机代码进行 OpenGL 调用。 Java OpenGL API 只是围绕本机函数的一个非常薄的层。无论是从本机代码还是通过 Java API 调用这些函数,都没有什么区别。
您唯一需要注意的是您调用all您的本机代码从GLSurfaceView.Renderer
的实施onSurfaceCreated()
, onSurfaceChanged()
and onDrawFrame()
。当这些方法被调用时,您处于渲染线程中,并且拥有当前的 OpenGL 上下文。如果从其他任何地方调用本机 OpenGL 代码,则很可能您处于错误的线程中和/或没有当前的 OpenGL 上下文。
当然,还有更复杂的设置,您可以创建自己的 OpenGL 上下文,显式地将它们设置为当前上下文,等等。但我强烈建议您坚持使用上面的简单方法,除非您有充分的理由需要更多东西。对于大多数标准 OpenGL 渲染,我所描述的应该已经足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)