Android.AndEngine.Артефакты изображения, где используется прозрачность - PullRequest
1 голос
/ 17 января 2012

Я использую AndEngine (2D движок на основе OpenGL). Когда я использую текстуры с прозрачностью (изображения PNG), у меня появляются артефакты на границах изображения. Мне нужна помощь, чтобы исправить это. Я приложил 2 изображения. Сначала у меня есть только текст, отображаемый с использованием некоторого шрифта На втором вы можете видеть закругленный угол, но на углу текстуры вы можете увидеть и артефакт. Обратите внимание, что это происходит только на реальном устройстве. На эмуляторе все ок. Мое устройство - Samsung i5700 Galaxy Spica под управлением Android 2.1
угол с артефактом http://i44.tinypic.com/2crttlx.png текст с артефактом http://i39.tinypic.com/10r4yn9.png

Ответы [ 5 ]

10 голосов
/ 24 мая 2012

Большое сообщество Wiki of AndEngine Artifacts

Спрайтовые артефакты

БИЛИНЕЙНАЯ фильтрация интерполирует цвет ближайших четырех пикселей, что делает текстуру приятной при масштабировании / повороте или смещении с нецелым числомзначений, но имеет некоторые трудности.

Артефакт черной или темной линии

Фон атласа текстуры, возможно, черный, и краевые пиксели texregion смешиваются с этим фоном.Используйте собственный прозрачный текстурный атлас или модифицированный конструктор TextureAtlas, который заполняется прозрачностью (TODO найти ссылку на форум, где это описано)

У края спрайта есть нежелательная альфа

Если фон текстурыпрозрачен, альфа все еще смешивается с краями.Добавьте 1-пиксельное выдавливание к своей области текстуры (повторите краевые пиксели в дополнительной строке / столбце по краям) и поместите края своей области между исходным и добавленным краевыми пикселями.Это гарантирует, что билинейная интерполяция выберет только пиксели из вашей области.

Другой артефакт края

Если области текстуры расположены слишком близко, край области может занять несколько пикселей от края других областей.Используйте отступы между областями текстуры.

Текстовые артефакты

Небольшая вертикальная линия под базовой линией (GLES1)

В моем шрифте символ J имел чрезмерно левыйрасширение нижней кривой, которая вызывает небольшой артефакт при рендеринге буквы I, поскольку IJ находятся рядом друг с другом в текстуре и, возможно, слишком близко.

Попробуйте уменьшить размер шрифта, увеличив текстуруразмер или взлом в большем Font.PADDING значении (5 работало для меня вместо 1).Однако обратите внимание, что по умолчанию увеличение PADDING также увеличивает межстрочный интервал, что может быть нежелательным.Новый YPADDING может быть введен и использован там, где это необходимо для компенсации.

Исчезающие буквы

Буквы отображаются по запросу в текстурном атласе шрифта.Это может привести к нехватке места на текстурном атласе, что приведет к забавным эффектам (см. Dissapearing ChangeableText ).

Одним из решений может быть вставка этого фрагмента в метод Font#createLetter(char):

    if (this.mCurrentTextureY + letterHeight > textureHeight) {
        throw new IllegalStateException("Could not allocate space for letter " + pCharacter + " on texture. " +
                "Please enlarge the texture atlas size. This would be letter #" + this.mLetterCount);
    }
5 голосов
/ 18 января 2012

Я разобрался с решением. Причиной этих артефактов были настройки фильтрации текстур. Я использовал TextureOptions.BILINEAR и TextureOptions.BILINEAR_PREMULTIPLYALPHA , которые вызвали артефакты. Я выбрал TextureOptions.DEFAULT , и текстуры стали четкими и без каких-либо артефактов. Есть один недостаток, хотя. У меня плавное движение спрайтов в моей игре. Но с этим новым параметром фильтрации (и в результате четкость текстуры) движение спрайта стало не плавным ... немного прерывистым. Нужно будет создать пару TextureAtlases с различными вариантами фильтрации.

2 голосов
/ 26 января 2012
0 голосов
/ 18 января 2012

Когда вы помещаете textureRegions в текстуру, обязательно оставляйте буфер в несколько пикселей. Я обнаружил эту же проблему с текстурой, отображающей пиксель или около того соседней области текстуры. Просто добавьте границу в 2-5 пикселей, и она должна исчезнуть.

0 голосов
/ 17 января 2012

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

...