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

Поддержка OpenGL ES 2.0 для Android?

Я видел, как несколько человек берут эту тему и начинают меня путать. Я действительно надеюсь, что кто-то может дать мне окончательный ответ!:)

Я предполагаю, что нужно быть тупым: поддерживает ли эмулятор Android OpenGL ES 2.0? Я видел, как некоторые люди говорили: "Да, но вам нужно изменить несколько настроек". и я также видел "Нет, это не поддерживает, период". Вот что я сделал, чтобы попытаться исправить проблему, включая некоторые сообщения об ошибках, которые я получил.

Сначала я модифицировал AndroidManifest.xml, чтобы содержать следующий код:

<uses-feature 
    android:glEsVersion="0x00020000" />

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="17" />

Затем, когда я хочу создать экземпляр моего GLSurfaceView, я использую эту последовательность кода для его создания:

super(context);

setEGLContextClientVersion(2);

setRenderer(new MyRenderer());
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

Затем, везде, где я смотрел, я сказал, что вы должны войти в AVD Manager, выбрать эмулятор, перейти к "Hardware", добавить "эмуляцию графического процессора" и установить логическое значение "yes". Однако вот что я вижу, когда смотрю на меня:

Screenshoot of my Android 4.2 emulator window.

Какая особенность заключается в том, что у меня есть другой эмулятор в моем AVD Manager, у которого у меня есть таблица "Оборудование":

What does my Android 2.2 emulator have the hardware table?

И просто для того, чтобы показать вам, что я делаю, вот какой-то код, который делает некоторые вещи, которые я хочу делать в OpenGL ES 2.0 (в основном я получил это от собственных обучающих программ Android):

int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

program = GLES20.glCreateProgram();
GLES20.glAttachShader(program, vertexShader);
GLES20.glAttachShader(program, fragmentShader);
GLES20.glLinkProgram(program);

Я не хочу менять свой код для работы с OpenGL ES 1.0, потому что это потребует много головных болей, и если я смогу его избежать, я буду.

Наконец, когда я пытаюсь запустить свою программу, программа закрывается с окном: "К сожалению, остановилась". Это то, что сказал мне LogCat:

12-05 06:16:27.165: E/AndroidRuntime(936): FATAL EXCEPTION: GLThread 81
12-05 06:16:27.165: E/AndroidRuntime(936): java.lang.IllegalArgumentException: No config chosen
12-05 06:16:27.165: E/AndroidRuntime(936):  at    android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:874)
12-05 06:16:27.165: E/AndroidRuntime(936):  at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1024)
12-05 06:16:27.165: E/AndroidRuntime(936):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1401)
12-05 06:16:27.165: E/AndroidRuntime(936):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

Я скажу, что я не эксперт по этому поводу, и это мой первый опыт работы с OpenGL. Если у кого-нибудь есть идеи, что я могу сделать, чтобы исправить это, я был бы навсегда благодарен.:) Спасибо!

4b9b3361

Ответ 1

Я могу сказать "Да" на ваш вопрос. Android-эмулятор поддерживает OpenGL ES 2.0. Я создал приложение с cocos2d-x v.2 (которое использует OpenGL ES 2.0). У меня было такое же FATAL EXCEPTION: ошибка GLThread 81 с тем же стеклом. Я решил эту проблему, добавив

gLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);

перед установкой renderer setRenderer:

gLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());

Теперь я могу запустить свое приложение на эмуляторе Android.

См. мой вопрос и ответ на fooobar.com/questions/237103/.... Мой пост по этой ссылке содержит скриншот с настройками AVD:

http://www.cocos2d-x.org/boards/6/topics/12563?r=19274#message-19274

Ответ 2

Я просто исправил проблему без добавления новых строк в исходный код. В avd-manager я устанавливаю "Использовать главный GPU" для своего эмулятора. Работает отлично на моем GeForce GTX 570.

Уровень API на эмуляторе равен 16, а min-SDK в манифесте - 15.

Ответ 3

Получена та же проблема. Исходный код Buggy:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(this.getClass().getName(), "Into onCreate Draw triangle");
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    if (detectOpenGLES20()){
        Log.d("GLES20", "GL ES 2.0 Supported..............!");
    } else {
        Log.d("GLES20", "GL ES 2.0 Not Supported...............!");
    }

    view = new GLSurfaceView(this);
    view.setEGLContextClientVersion(2);
    view.setEGLConfigChooser(true);
    view.setRenderer(new TriangleRenderer(view));
    setContentView(view);
}


Решение:

a.) Замена этой кодовой строки

view.setEGLConfigChooser(true);

с

view.setEGLConfigChooser(8, 8, 8, 8, 16, 0);


 b.) Настройка -gpu on через Eclipse → Run as --- > Target --- > Дополнительные параметры командной строки эмулятора

Добавление немного больше к рассмотренному выше обсуждению:
Было два разных сообщения об исключении, с которыми я столкнулся, работая над вышеуказанным фрагментом кода

FATAL EXCEPTION: GLThread 75 java.lang.IllegalArgumentException: никакие конфиги не соответствуют configSpec

и

java.lang.IllegalArgumentException: Конфигурация не выбрана

Более подробное тематическое исследование описано в http://on-android-opengl2.blogspot.in/2013/05/android-opengl-es-20-emulator.html