Android OpenGLES Rendering using C++ and Java

2022-09-04 20:51:02

我有一个使用GLES进行渲染的Android应用程序。目前使用Java来渲染东西,渲染很好。由于Android Java应用程序内存的限制,我计划将本机渲染集成到我的Java渲染代码中。

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

最简单的代码版本是:https://github.com/khedd/JavaCppGLES Java代码呈现三角形,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 ();
}

答案 1

由于未解除绑定缓冲区,导致问题。

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();

无需上下文切换。


推荐