使用C++和Java实现Android OpenGLES渲染

13

我有一个使用GLES进行渲染的安卓应用程序。目前使用Java进行渲染,渲染效果良好。由于Android Java应用程序内存的限制,我计划将本地渲染集成到我的Java渲染代码中。

为此,我遵循了基本的本地GLES教程。在集成后,Java渲染不可见,只能看到我在C++中渲染的内容。

代码的最简版本位于:https://github.com/khedd/JavaCppGLES,Java代码渲染三角形,C++代码渲染正方形。如果两者都被调用,则只有正方形被渲染。

我该如何解决这个问题?我应该把所有东西都移植到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 ();
}

你是出于“内存原因”这样做的吗?为什么你认为这会使用更少的内存?此外,很可能你的C++和Java OpenGL调用发生在不同的线程上,但是,如果没有任何代码或关于Java和C++之间交互的想法,那么提供建议将会非常困难。 - MuertoExcobito
它不会占用更少的内存,但在本机中我可以使用更多的空间。另外,你是对的,我明天会尝试提供一个样例代码。我非常确定它们在Java的drawFrame调用中处于同一线程中。 - Hakes
2个回答

12

问题的原因是没有解除绑定缓冲区。

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

将这两行代码添加到init和render函数中可以解决问题。


3
最简单的方法是直接从你的表面渲染器中调用你的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();

无需上下文切换。

我也在尝试做同样的事情,但是我有一个Java遗留代码,所以我的第一选择是将它们一起使用。顺便说一下,在我的代码中,我没有调用本地的surface_created和surface_changed,只使用了surface_draw。我会研究一下这个问题,谢谢。 - Hakes
1
我把初始化移到了cpp文件中,但是没有任何改变,Java三角形仍然无法渲染。 - Hakes
如果您展示您的初始化和绘图代码,我应该能够更好地理解。 - WLGfx
Git 项目使用的是 Java 初始化版本,对于 C++ 的初始化,我只是将视口和 glClearColor 移动到了相应的部分,就这些了。我还需要添加什么? - Hakes
你在原始帖子中链接的项目在着色器中使用了高精度 highp。Android GLES 通常总是使用中等精度 mediump。我现在要打包回家,稍后会进一步研究它。 - WLGfx
我正在使用的设备A7在着色器中支持高精度(highp),并通过'GetShaderPrecisionFormat'进行了双重确认。 - Hakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接