Как избавиться от неровных краев в Android OpenGL ES?
У меня есть следующий код:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
//gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
Но все же края в Android Emulator сильно зазубрены. Каково решение?
5 ответов
Ну, лучший способ - это использовать Multisampling (сглаживание). Поскольку вы используете эмулятор, это не вариант для вас. ( Multismapling поддерживается в OpenGL ES 2.0, но эмулятор не поддерживает 2.0) В соответствии со спецификацией OpenGL, устройство может игнорировать заданный вами glHint, поэтому не ожидайте многого от него. GL_DITHER - это способ "подделать" 24-битную глубину цвета из 16-битной глубины цвета, в основном это не имеет никакого отношения к краям.
Хотя есть старый метод "подделки" сглаживания, который я никогда не использовал, поэтому я не могу рассказать вам, как, но вы можете найти некоторые подсказки в Интернете.
Функция смешивания (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) также полезна для рендеринга сглаженных точек и линий в произвольном порядке.
Сглаживание полигонов оптимизируется с помощью функции наложения (GL_SRC_ALPHA_SATURATE, GL_ONE) с полигонами, отсортированными от ближайшего к дальнему.
http://code.google.com/p/gdc2011-android-opengl/ содержит пример кода для мультисэмплинга.
Вы включаете сглаживание полигонов, используя "подсказку". Подсказка - это просто "подсказка" к реализации, которую нужно сгладить ребрам многоугольника. Реализация может игнорировать его, если захочет.
Это именно то, что он делает.
Кроме того, весьма вероятно, что вы просто не сможете включить сглаживание на устройствах Android, потому что они просто недостаточно мощны, чтобы сделать это. Это может отличаться для разных телефонов, но, опять же, вы устанавливаете подсказку.
Я просто прошел через те же проблемы, что и вы. Я думаю, что вы ищете следующую строку кода:
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
- Попробуйте на устройстве. Я не доверяю эмулятору для визуальных / графических проблем.
- Пытаться
gl.glEnable(GL10.GL_DITHER);
, Я не уверен, включен ли он по умолчанию. Также: это замедляет рисование.