2017-07-19 132 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