OpenGL ES. Прокрутка трехслойных текстур звездного поля дает мне 60 - > 40 кадров в секунду
Вопрос
Мне нужно нарисовать фон для шутера с 2D-прокруткой. Мне нужно реализовать 3 слоя звезд: одна далекая туманность (движется очень медленно) на заднем плане, один слой очень далеких звезд (движется медленно) и один слой близких звезд (движется нормально) поверх двух других. р>
Сначала я попробовал использовать 3 текстуры размером 320 x 480, которые были прозрачными pngs звезд. Я использовал GL_BLEND и SRC_ALPHA, ONE_MINUS_SRC_ALPHA.
Результаты не были хорошими даже на 3GS. На устройствах первого поколения FPS упал до 40 ... 50, поэтому я думаю, что я делаю это неправильно.
Когда я отключаю GL_BLEND, все отлично работает, даже на устройствах 1-го поколения, и FPS снова возвращается к 60 ... так что, должно быть, я пытаюсь создать большие прозрачные текстуры.
Проблема в том, что я не знаю, как это сделать другим способом ...
Должен ли я нарисовать только первую туманность в виде непрозрачной текстуры, а затем попытаться эмулировать средний и верхний звездный слой с небольшими точками, движущимися по экрану?
Есть ли другой подход к проблеме смешивания? Как я могу ускорить процесс рендеринга? Является ли одна большая текстура (tileset) ответом?
Пожалуйста, помогите мне, потому что я застрял здесь, и я не могу выйти.
Решение
Я не знаю, как вы хотите, чтобы ваши звезды выглядели, но вы можете попытаться переместить их из текстуры в геометрию, используя GL_POINTS
в DrawElements
или DrawArrays
может просто заменить два верхних слоя слоями геометрии. Вы можете манипулировать точками, используя PointSize
, PointSizePointerOES
и PointParameter
, чтобы изменить рендеринг точек. Р>
Другие советы
Возможно, вы захотите использовать мультитекстурирование, чтобы увидеть, ускоряет ли это. Каждому этапу с несколькими текстурами может быть назначена уникальная матрица преобразования, поэтому вы должны иметь возможность переводить каждый слой с разными скоростями.
Я считаю, что все модели iPhone поддерживают два этапа текстур, поэтому вы сможете объединить два слоя в один вызов отрисовки. Возможно, вам все еще придется прибегнуть к смешиванию для третьего слоя.
Также обратите внимание, что альфа тестирование может быть быстрее, чем альфа смешивание .
Удачи!
Задняя туманность должна быть непрозрачной; все остальное нарисовано поверх него, и я предполагаю, что единственное, что стоит за ним, - это черное. Кроме того, у prideout есть смысл: если предположить, что ваши звездные слои могут иметь эффективную 1-битную альфа, это определенно то, что вы можете попробовать. Если это не удастся, техника GL_POINTS, о которой упоминает Харальд, тоже подойдет.