2017-07-19 108 views
12

我有一个使用GLES进行渲染的android应用程序。目前使用Java来渲染东西,并呈现很好。由于Android Java应用程序内存的限制,我计划将原生渲染集成到我的Java渲染代码中。使用C++和Java的Android OpenGLES渲染

为此,我遵循基本的本地GLES教程。集成之后,Java渲染不可见,只能看到我用C++渲染的东西。

代码的最简单版本是:https://github.com/khedd/JavaCppGLES Java代码呈现三角形,C++呈现四元组。如果两者都只被称为Quad是渲染器。

我该如何解决这个问题?我应该将所有内容移植到C++吗?

代码简而言之。

MyGLRenderer(){ 
    mTriangle = new Triangle(); 
    mCppRenderer = new MyCppRenderer(); 
} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClearColor(1.0f, 0.0f, 1.0f, 1.0f); 

    //init java triangle 
    mTriangle.init(); 
    //init c quad 
    mCppRenderer.init(); //comment this line to make java triangle appear 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 
} 

@Override 
public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    mTriangle.draw(); 
    mCppRenderer.draw(); 
} 
+0

你为“记忆原因”做了这个?你为什么期望这会使用更少的内存?另外,您的C++和Java OpenGL调用可能在不同的线程上发生,但是,如果没有Java和C++之间的iterop代码或想法,那么提供建议将非常困难。 – MuertoExcobito

+0

它不会使用更少的内存,但在本地我可以使用更多的空间。你也是对的,我会试着在明天提供一个示例代码。我很确定它们在java的drawFrame调用中位于同一线程中。 – Hakes

回答

11

该问题是由于未解除绑定缓冲区而引起的。

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

将这两行添加到init和render会修复问题。

2

最简单的方法是直接从曲面渲染器调用C++代码。

private class PlayerRenderer implements GLSurfaceView.Renderer { 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     surface_created(); // native c++ 
    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int wid, int hgt) { 
     surface_changed(wid, hgt); // native c++ 
    } 

    @Override 
    public void onDrawFrame(GL10 gl) { 
     surface_draw(); // native c++ 
    } 
} 

private native void surface_created(); 
private native void surface_changed(int w, int h); 
private native void surface_draw(); 

无需上下文切换。

+0

我正在尝试做同样的事情,但我在Java中有一个遗留代码,所以我的第一个选择是一起使用这些代码,在我的代码中我没有调用原生的surface_created,并且仅使用了曲面绘制。我会研究这个,谢谢。 – Hakes

+1

我把我的初始化移动到cpp,但没有任何改变,java三角形仍然没有被渲染。 – Hakes

+0

如果你显示你的初始化和绘图代码,那么我应该能够更好地理解。 – WLGfx