OpenGL ES. Прокрутка трехслойных текстур звездного поля дает мне 60 -> 40 кадров в секунду. - PullRequest
1 голос
/ 27 октября 2009

Мне нужно нарисовать фон для шутера с 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) ответом?

Пожалуйста, помогите мне, потому что я застрял здесь, и я не могу выбраться.

Ответы [ 3 ]

5 голосов
/ 27 октября 2009

Я не знаю, как вы хотите, чтобы ваши звезды выглядели, но вы можете попробовать переместить их из текстуры в геометрию, используя GL_POINTS в DrawElements или DrawArrays, возможно, просто замените верх два слоя со слоями геометрии. Вы можете манипулировать точками, используя PointSize, PointSizePointerOES и PointParameter, чтобы изменить рендеринг точек.

3 голосов
/ 27 октября 2009

Возможно, вы захотите использовать мультитекстурирование, чтобы увидеть, ускоряет ли это. Каждому этапу с несколькими текстурами может быть назначена уникальная матрица преобразования, поэтому вы должны иметь возможность переводить каждый слой на разных скоростях.

Я считаю, что все модели iPhone поддерживают два этапа текстур, поэтому вы сможете объединить два слоя в один вызов отрисовки. Возможно, вам все еще придется прибегнуть к смешиванию для третьего слоя.

Также обратите внимание, что альфа тестирование может быть быстрее, чем альфа смешивание .

Удачи!

1 голос
/ 27 октября 2009

Задняя туманность должна быть непрозрачной; все остальное нарисовано поверх него, и я предполагаю, что единственное, что стоит за ним, - это черное. Кроме того, у prideout есть смысл: если предположить, что ваши звездные слои могут иметь эффективную 1-битную альфа, это определенно то, что вы можете попробовать. Если это не удастся, техника GL_POINTS, о которой упоминает Харальд, тоже подойдет.

...