Подтвердить что ты не робот

Android OpenGLES рендеринг с использованием С++ и Java

У меня есть приложение для Android, которое использует GLES для рендеринга. В настоящее время используется Java для рендеринга, а рендеринг - в порядке. Из-за ограничений в памяти приложений Android Java я планирую интегрировать собственный рендеринг с моим кодом рендеринга Java.

Чтобы сделать это, я выполнил основные учебные руководства GLES. После интеграции рендеринг Java не был виден, были видны только те вещи, которые я визуализировал на С++.

Простейшая версия кода: https://github.com/khedd/JavaCppGLES Java-код отображает треугольник, а на С++ - квадрат. Если оба вызываются, то только Quad является рендерером.

Как я могу решить эту проблему? Должен ли я переносить все на С++?

Код в двух словах.

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 ();
}
4b9b3361

Ответ 1

Проблема была вызвана тем, что они не отвязали буферы.

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

Добавление этих двух строк в init и render устраняет проблему.

Ответ 2

Самый простой способ сделать это - прямо позвонить вашему С++-коду из вашего средства визуализации поверхности.

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

Нет необходимости в переключении контекста.