2017-07-19 24 views
12

Tôi có một ứng dụng Android sử dụng GLES để hiển thị. Hiện đang sử dụng Java để hiển thị nội dung và việc hiển thị là tốt. Do giới hạn trong bộ nhớ ứng dụng Java của Android, tôi dự định tích hợp hiển thị gốc vào mã dựng hình Java của tôi.Hiển thị OpenGLES Android bằng C++ và Java

Để làm điều này, tôi đã làm theo hướng dẫn GLES gốc cơ bản. Sau khi tích hợp, hiển thị Java không hiển thị, chỉ những thứ tôi render trong C++ mới được nhìn thấy.

Phiên bản mã đơn giản nhất là: https://github.com/khedd/JavaCppGLES Mã Java hiển thị hình tam giác, C++ hiển thị Quad. Nếu cả hai được gọi là Quad là renderer.

Tôi làm cách nào để giải quyết vấn đề này? Tôi có nên chuyển mọi thứ sang C++ không?

Viết tóm lại.

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

Bạn đã làm điều này vì "lý do bộ nhớ"? Tại sao bạn mong đợi điều này sẽ sử dụng ít bộ nhớ hơn? Ngoài ra, có khả năng các cuộc gọi C++ và Java OpenGL của bạn đang diễn ra trên các luồng khác nhau, nhưng, không có bất kỳ mã hoặc ý tưởng nào về vòng lặp giữa Java và C++, sẽ rất khó để đưa ra lời khuyên. – MuertoExcobito

+0

nó sẽ không sử dụng ít bộ nhớ nhưng trong bản địa tôi có thể sử dụng nhiều không gian hơn. Ngoài ra bạn là đúng tôi sẽ cố gắng cung cấp một mã mẫu vào ngày mai. Tôi khá chắc chắn rằng họ đang trên cùng một chủ đề trong cuộc gọi drawFrame của java. – Hakes

Trả lời

11

Sự cố đã xảy ra do không bẻ khóa bộ đệm.

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

Thêm hai dòng này để bắt đầu và hiển thị sửa lỗi.

2

Cách dễ nhất để thực hiện việc này là gọi trực tiếp mã C++ từ trình kết xuất bề mặt của bạn.

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

Không cần chuyển ngữ cảnh.

+0

Tôi đang cố gắng làm như vậy tuy nhiên tôi có một mã di sản trong Java vì vậy lựa chọn đầu tiên của tôi là sử dụng chúng với nhau, bằng cách trong mã của tôi tôi đã không gọi bản địa surface_created và bề mặt thay đổi chỉ vẽ bề mặt được sử dụng. Tôi sẽ xem xét điều này, cảm ơn. – Hakes

+1

Tôi đã chuyển khởi tạo thành cpp, nhưng không có gì thay đổi tam giác java vẫn chưa được hiển thị. – Hakes

+0

Nếu bạn hiển thị mã khởi tạo và bản vẽ của mình, tôi sẽ có thể hiểu rõ hơn sau đó. – WLGfx

Các vấn đề liên quan