Удаление объектов за пределами экрана в OpenGL ES 2 2D

Я балуюсь с OpenGL ES 2.0. Если я работаю с простой 2D-проекцией, если у меня есть большая 2D-сетка вершин, которые в значительной степени статичны (подумайте о плитках карты), из которых только небольшая часть видна в любой момент времени, было бы лучше...

  • Определить в ЦП, какие вершины видны, и создать VBO для рисования только тех треугольников, которые составляют видимые плитки в каждом кадре?

или

  • Сохранять статический VBO со всей мозаичной сеткой, а затем просто полагаться на графическую карту (RPi, в моем случае), чтобы вырезать внеэкранные треугольники?

Или, возможно, какая-то их комбинация (например, наборы перекрывающихся предварительно вычисленных сеток)? Насколько большой должна быть сетка, чтобы последний вариант стал неработоспособным?

Редактировать Я решил сделать несколько вызовов glDrawElements(), отрисовывая поддиапазоны индексного буфера, которые, как я знал, будут перекрывать область просмотра. В масштабе, над которым я работаю, похоже, это не влияет на скорость рисования всего массива элементов, даже на Pi Zero.

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

Думаю, есть и другие варианты, например, более экзотическая структура для разделения самолета на части. Однако все еще не уверен, действительно ли это необходимо.

Спасибо!

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

1 ответ

Решение

Если это обычная сетка, я бы разделил ее на большие куски, чтобы ширина экрана (большая сторона) поместилась на 2-3 таких куска. Их не нужно перекрывать, если это обычная сетка.

Проверка видимости одного фрагмента тривиальна и дёшево, равно как и поиск / выбор тех немногих, которые необходимо нарисовать. И потраченная / обрезанная область достаточно мала, чтобы не беспокоиться об этом. Вам не нужно сходить с ума и обрезать каждую вершину за пределами экрана.

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

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

Другие вопросы по тегам