Прокрутка / масштабирование сцены в OpenGL и подразделении - PullRequest
9 голосов
/ 30 января 2012

Мы должны разработать сцену прокрутки / масштабирования в OpenGL ES на Android, очень похожую на уровень в Angry Birds, но больше похожую на уровень в World Of Goo.Больше похоже на последнее, так как мир будет состоять не из повторяющихся слоев, как в Angry Birds, а из большого изображения.Поскольку сцену нужно прокручивать / масштабировать и, следовательно, большая ее часть не будет видна, я задавался вопросом о наиболее эффективном способе реализации рендеринга, фокусируясь только на окружающей среде (т.е. не на объектах в мире, а на фоновых слоях).

Мы будем использовать ортогональную проекцию.

Первое, что приходит на ум, - это создание большого прямоугольника с 4 вершинами в мировом размере, которому сопоставлена ​​фоновая текстура, и перевести / масштабироватьэто с помощью glTranslatef / glScalef.Однако мне было интересно, если OpenGL все еще визуализирует невидимую область за пределами границ экрана, поскольку она не отбраковывается (вы потеряете видимую область, так как имеется только 4 вершины).Следовательно, будет ли эффективнее подразделить этот прямоугольник, чтобы можно было отбраковать невидимые меньшие прямоугольники?

Другой вариант - создать прямоугольник с 4 вершинами, который заполнит экран, а затем переместить фон, отрегулировав его текстуру.координаты.Тем не менее, я думаю, что мы столкнемся с проблемами при построении больших миров, учитывая ограничение размера текстуры.Это похоже на хорошую реализацию для повторяющихся фонов, как у AngryBirds.

Может быть, есть другой способ ..?

Если у кого-то есть идея, как это можно сделать в AngryBirds / World of GooПожалуйста, поделитесь, как я хотел бы услышать.Кажется, они внедрили систему, которая позволяет плавно перемещать и масштабировать мир (WorldOfGoo = VERY).

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Это, вероятно, ваш лучший выбор для реализации .

По моему опыту, сохранение большой текстуры в памяти очень дорого для Android. Я бы получил довольно много исключений OutOfMemoryError для фоновой текстуры, прежде чем перейти к плитке.

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

Редактировать: Ознакомьтесь с 53:28 этой презентации из Google I / O 2009.

0 голосов
/ 14 февраля 2012

Afaik не будет никакого падения производительности из-за того, что большие области визуализируются вне экрана, деление и отбраковка обычно выполняется только для уменьшения количества вершин, но на самом деле вы добавили бы его сюда.

Помещение этогопока в стороне;по тому, как вы сформулировали вопрос, я не уверен, есть ли у вас большая фоновая текстура или небольшая повторяющаяся.Если он большой, то вам все равно придется делить из-за ограничений по размеру текстуры, так что вопрос спорный!Если он маленький, я бы предложил второй метод, поместил квадратор на экран и переместил фон, изменив координаты текстуры.

Я чувствую, что, возможно, что-то пропустил, так как не уверенпочему вы упомянули проблему ограничения размера текстуры, когда говорили о методе координат текстуры, а не о методе большого квадрата.Конечно, для обоих это не проблема для повторения текстур, так как вы можете использовать режим обтекания текстурой GL_REPEAT ...

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

Приветствия.

0 голосов
/ 14 февраля 2012

Вы можете разбить фоновый прямоугольник на меньшие прямоугольники, чтобы OpenGL отображал только видимые прямоугольники. У вас не будет прямоугольника с большой задницей с загруженной текстурой с большой задницей, а меньшие прямоугольники с текстурами меньшего размера, которые можно загружать / выгружать, в зависимости от того, что видно на экране ...

...