Intereting Posts
Как получить стандартный шрифт Android-устройства? Должен ли я объявлять как WRITE_EXTERNAL_STORAGE, так и READ_EXTERNAL_STORAGE? Как прослушивать изменение состояния в виджетах SwitchCompat? OnCreateLoader не вызывается при изменении ориентации Предложения клавиатуры приводят к тому, что часть сообщения Android EditText.setError () не отображается Нужно ли мне называть getWritableDatabase () каждый раз, когда я манипулирую данными Кнопка блокировки в Android Могу ли я установить PIN-код для Bluetooth из своего приложения на Android? Сравните голос wav в андроиде или голосовую метку (голосовые команды) API AndroidDebugKey Keystore был взломан, или пароль был неправильным Как читать выделенный текстовый файл из sdcard на Android Рекомендуемое соотношение размеров текста между мобильными и планшетными устройствами? Модернизация 2 не может загрузить файл с двумя дополнительными отдельными строковыми параметрами Смешивание двух изображений вместе с умножением и% непрозрачности Почему короткий примитивный тип значительно медленнее, чем long или int?

Android OpenGLES Rendering с использованием C ++ и Java

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

Для этого я следил за базовыми учебниками 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 (); } 

Solutions Collecting From Web of "Android OpenGLES Rendering с использованием C ++ и Java"

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

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

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