我有一个使用GLES进行渲染的android应用程序。目前使用Java来渲染东西,渲染很好。由于Android Java应用程序内存的限制,我计划将本机呈现集成到我的Java呈现代码中。
为此,我遵循了基本的原生GLES教程。集成后,Java渲染不可见,只看到我在C ++中渲染的东西。
最简单的代码版本位于:https://github.com/khedd/JavaCppGLES Java代码呈现Triangle,C ++呈现Quad。如果两者都被调用,则只有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 :(得分:11)
问题是由于未解除缓冲区绑定而引起的。
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
将这两行添加到init和render中可以解决问题。
答案 1 :(得分: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();
无需上下文切换。