簡體   English   中英

Android OpenGLES使用C ++和Java進行渲染

[英]Android OpenGLES Rendering using C++ and Java

我有一個使用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 ();
}

問題是由於沒有解除緩沖區綁定引起的。

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

將這兩行添加到init和render可以解決問題。

最簡單的方法是直接從表面渲染器調用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();

無需上下文切換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM