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

StackOverflow https://stackoverflow.com/questions/1627418

Вопрос

Мне нужно нарисовать фон для шутера с 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, о которой упоминает Харальд, тоже подойдет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top