Как избавиться от неровных краев в Android OpenGL ES? - PullRequest
4 голосов
/ 08 февраля 2011

У меня есть следующий код:

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 ]

11 голосов
/ 24 марта 2011

http://code.google.com/p/gdc2011-android-opengl/ имеет пример кода для мультисэмплинга.

4 голосов
/ 15 марта 2011

Что ж, лучший способ - использовать мультисэмплинг (сглаживание). Поскольку вы используете эмулятор, это не вариант для вас. (Multismapling поддерживается в OpenGL ES 2.0, но эмулятор не поддерживает 2.0) Согласно спецификации OpenGL, устройство может игнорировать заданный вами glHint, так что многого от него не ожидайте. GL_DITHER - это способ «подделать» 24-битную глубину цвета из 16-битной глубины цвета, в основном это не имеет никакого отношения к краям.

Хотя существует старый метод «подделки» сглаживания, он тот же, который я никогда не использовал, поэтому я не могу сказать вам, как, но вы можете найти некоторые подсказки в Интернете.

Из Документы OpenGL

Функция смешивания (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) также полезна для визуализации сглаженных точек и линий в произвольном порядке.

Сглаживание полигонов оптимизируется с помощью функции наложения (GL_SRC_ALPHA_SATURATE, GL_ONE) с сортировкой полигонов от ближайшего к дальнему.

1 голос
/ 16 сентября 2012

Я только что прошел через те же проблемы, что и вы.Я думаю, что вы ищете следующую строку кода:

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
1 голос
/ 08 февраля 2011

Вы включаете сглаживание полигонов, используя «подсказку».Подсказка - это просто «подсказка» реализации, которую нужно сгладить краям многоугольника.Реализация может игнорировать ее, если захочет.

Это именно то, что она делает.

Более того, весьма вероятно, что вы просто не сможете включить сглаживание на устройствах Androidпотому что они просто недостаточно сильны, чтобы сделать это.Это может отличаться для разных телефонов, но, опять же, вы устанавливаете подсказку.

0 голосов
/ 08 февраля 2011
  1. Попробуйте на устройстве. Я не доверяю эмулятору для визуальных / графических проблем.
  2. Попробуйте gl.glEnable(GL10.GL_DITHER);. Я не уверен, включен ли он по умолчанию. Также: это замедляет рисование.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...