Проблема с Android OpenGL Multisampling / Antialiasing

Я работаю над приложением для Android, которое позволяет пользователю касаться экрана, чтобы рисовать цвета. У меня есть весь код рисования, хорошо работающий под OpenGL (тестирование на Android 4.0.4, Galaxy Nexus, хотя я пытаюсь сделать его обратно совместимым, насколько это возможно; мой SDK нацелен на API 14, но имеет minSDK 8 ).

Проблема, с которой я столкнулся, связана со сглаживанием; Я хочу, чтобы все мои полигоны и линии были сглажены, но они получаются неровными. Я уверен, что Galaxy Nexus поддерживает сглаживание (я видел это в других приложениях), поэтому я уверен, что делаю что-то не так.

Я уже больше часа провожу вверх и вниз по Google, отвечая на несколько вопросов и ответов на StackOverflow, и нашел несколько ответов:

gl.glEnable(GL10.GL_BLEND);
gl.glEnable(GL10.GL_ALPHA_BITS);
gl.glEnable(GL10.GL_MULTISAMPLE);
gl.glEnable(GL10.GL_SMOOTH);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_NICEST);

Я добавил некоторые или все эти строки в разном порядке, но безрезультатно. (Они были добавлены в onSurfaceCreated.)

gl.glEnable(GL10.GL_DITHER);

Думаю, это немного помогло ... но, возможно, это мой разум играет со мной злую шутку. Однако даже при его использовании остаются неровные линии. (Также добавлено в onSurfaceCreated.)

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

Кажется, это самый распространенный ответ. Но при этом все рисуется невидимым; то есть при запуске с черным фоном все всегда просто черное. (Я знаю, что он все еще отображается из-за сообщений о промывке памяти в LogCat.) Я также пробовал это в сочетании со всеми другими методами, описанными выше. (И это также было добавлено в onSurfaceCreated.)

Подведем итоги: я использую OpenGL на Android 4+, и никакие методы мультисэмплинга не работают; в то время как большинство из них просто не имеет эффекта, использование glBlendFunc, похоже, полностью нарушает рендеринг.

Итак, я в тупике. Я открыт для любых предложений ... они наверняка помогут больше, чем дефенестрация моего компьютера!

Заранее благодарим всех терпеливых, прочитавших это.


person Eric    schedule 06.06.2012    source источник
comment
Вы создаете контекст EGL с явно запрошенной мультисэмплингом? У меня это работает, когда я делаю это из кода C.   -  person Mārtiņš Možeiko    schedule 06.06.2012
comment
Я специально не запрашивал мультисэмплинг для EGL, о котором мне известно. У меня есть вызов setEGLConfigChooser(8, 8, 8, 8, 0, 0); при создании рендерера, но кроме этого, я не трогаю его (только объект GL10).   -  person Eric    schedule 06.06.2012
comment
возможный дубликат Как избавиться от неровных краев в Android OpenGL ES?   -  person thakis    schedule 16.06.2014


Ответы (2)


Если вы не запрашивали мультисэмплинг в контексте EGL, вы не можете включить его только с помощью функций GL. Смотрите здесь, как это сделать:

person Mārtiņš Možeiko    schedule 06.06.2012
comment
При использовании MultisampleConfigChooser я получаю эту ошибку после создания Surface: 06-06 12:35:00.744: E/AndroidRuntime(14717): java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG. Есть идеи, почему он вылетает в этой конфигурации? - person Eric; 06.06.2012
comment
Кажется, для мультисэмплинга требуется OpenGL ES 2.0. Как ни странно, установка манифеста и setEGLContextClientVersion на использование 2.0 просто не работает, поэтому приложение просто выплевывает нереализованные ошибки API. В результате я решил, что преимущества мультисэмплинга недостаточно велики, чтобы о нем беспокоиться в этом приложении. Мартинс, я отметил ваш ответ как правильный, поскольку вы действительно имеете правильный ответ; приложение просто не поддерживает такое решение. Спасибо вам за помощь! - person Eric; 06.06.2012
comment
Вот моя версия EGLConfigChooser, которая в значительной степени основана на MultisampleConfigChooser выше, но с несколькими важными исправлениями: github.com/serso/android-plotter/blob/master/lib/src/main/java/ - person se.solovyev; 25.09.2014

Вы можете включить мультисэмплинг esay на c ++ (android ndk)
Если вы не можете программировать на c ++ srry.

  1. Установите android-ndk (моя версия android ndk - r8b)
  2. Открыть android-ndk-r8b/samples/android-native-egl-example/jni/renderer.cpp
  3. Изменить добавить, чтобы включить EGL/egl.h GLES/gl.h GLES2/gl2.h GLES2/gl2ext.h файлы
  4. в bool Renderer::initialize() function :

изменять

   const EGLint attribs to {
                EGL_RED_SIZE, 5,  
                EGL_GREEN_SIZE, 6,  
                EGL_BLUE_SIZE, 5,  
                EGL_DEPTH_SIZE, 16,  
                // Requires that setEGLContextClientVersion(2) is called on the view.
                EGL_RENDERABLE_TYPE, 4 /* EGL_OPENGL_ES2_BIT */,
                EGL_SAMPLE_BUFFERS, 1 /* true */,
                EGL_SAMPLES, 2,
                EGL_NONE  };

EGL_SAMPLES важен этот аргумент изменить номер выборки

person user3319091    schedule 17.02.2014