Поддержка 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. Если у кого-нибудь есть идеи, что я могу сделать, чтобы исправить это, я был бы навсегда благодарен.:) Спасибо!
Ответы
Ответ 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