Странное поведение OpenGL ES в приложении для iPhone

#iphone #opengl-es

Вопрос:

Я создаю простую 2D — игру для iPhone. Он основан на аварийной посадке. таким образом, это в основном фоновая текстура и несколько перемещающихся прямоугольных текстур.

У меня есть эта странная небольшая проблема с графикой: некоторые из небольших 2d-элементов (можно предположить, что это просто прямоугольники), перемещающиеся вокруг, получают поверх них маленькую мигающую черную полосу (текстура фона почти полностью белая, поэтому небольшая полоса заметна).

Текстуры, которые я использую, небольшие (~1 Кб) png.

Кто-нибудь еще сталкивался с этим? Является ли это распространенной проблемой OpenGL?

Кстати, это происходит как на симуляторе, так и на самом устройстве.

Комментарии:

1. Видите ли вы проблему как в симуляторе, так и на реальном устройстве?

2. Это происходит как на симуляторе, так и на реальном устройстве.

Ответ №1:

У вас есть такая штука, как эта маленькая черная полоска в ваших текстурах?

Я сталкивался с подобными проблемами, когда делал что-то не так. Вот небольшой контрольный список:

  • Вы сделали mip-сопоставление своей текстуры или нет, и проверьте, какие у нее параметры.
  • глТекСпараметры. (WRAP_S, WRAP_T, MAG_FILTER, MIN_FILTER…)
  • размеры текстуры. (Если не допускается использование двух текстур, это может вызвать графические сбои, в зависимости от того, как вы загружаете свои текстуры)
  • Вы рисуете эту мигающую полосу поверх своих прямоугольников?
  • Есть ли что-то, что вызывает черную полосу в вашей текстуре.
  • Выравнивание кадров анимации.
  • Смешивание и альфа-смешивание.

Если что-то в списке кажется вам расплывчатым, полезно почитать о них.

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

Я надеюсь, что мои советы имеют смысл. У меня есть только опыт работы с обычным opengl, а не с графическими конвейерами OpenGL, которые были обрезаны, чтобы сделать его более компактным, чистым и элегантным.

Ответ №2:

Поскольку это 2D-игра, содержатся ли эти маленькие прямоугольные спрайты в одном и том же листе текстур? Другим возможным виновником может быть фильтрация текстур.

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

В этом случае вы можете попробовать разместить буфер размером 1 пиксель на листе текстуры между спрайтами.