Рендеринг больших прямоугольных мозаичных изображений с помощью OpenGL QuadTree

В настоящее время я проектирую и разрабатываю специальную программу просмотра изображений для исключительно больших файлов изображений (иногда в гигапикселях). К счастью, они предоставляются в виде тайлов 256x256 в слоях поэтапного разрешения, а затем при необходимости передаются в OpenGL.

Сами плитки управляются с помощью QuadTree, что кажется сильным решением для изображений «почти степень двойки». Однако для изображения с чрезвычайно широким соотношением сторон (например, 1 гигапиксель x 50 000) модель начинает давать сбои при большом количестве нулевых плиток. Одновременно будет отображаться только ограниченное количество плиток.

Я использую Java 7 с LWJGL для предоставления контекста OpenGL.
Подходит ли решение QuadTree для этой проблемы или есть лучшие альтернативы управлению данными?

Изменить: отредактировал заголовок, чтобы сделать его более понятным.


person Mike D    schedule 20.05.2013    source источник
comment
Вы можете добавить дополнительный уровень вверху, разделив изображение на квадратные части, например. 20 изображений 50k x 50k, затем используйте quadtrees для квадратов.   -  person Andreas Haferburg    schedule 20.05.2013
comment
Как и почему вы хотите использовать opengl?   -  person dinony    schedule 20.05.2013
comment
Текущая реализация системы использует Java Graphics2D и JAI для предоставления изображений. Это доказывает, что они не работают на должном уровне. По этой причине он заменяется подходом OpenGL. OpenGL используется для повышения производительности рендеринга. Я реализовал прототип, больше основанный на тайлах LoD, и, похоже, он работает до сих пор. Что вы думаете об этом @AndreasHaferburg? (Я понимаю, что система Java, скорее всего, даст меньшую производительность, чем нативный C++, однако Java является жестким системным требованием.)   -  person Mike D    schedule 21.05.2013
comment
Я разработал средство визуализации, подобное тому, что вы описываете (например, Java + OpenGL с плиткой). По моему опыту, использование Java совершенно нормально, поскольку вы выполняете рендеринг с помощью OpenGL. Вам нужно всего несколько сотен плиток, чтобы заполнить экран, поэтому объем работы на ЦП довольно низок. Единственным исключением является декодирование ваших данных, которое обычно выполняется намного быстрее при реализации на c(++). Вам также может понадобиться быть осторожным с количеством мусора, который вы производите, чтобы обеспечить плавный FPS. Использование дерева квадрантов имеет несколько преимуществ:   -  person ThomasD    schedule 29.05.2013


Ответы (1)


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

У вас есть 2 решения:

  • Используйте БСП. Аналогичная концепция, но вместо разделения обоих диапазонов координат вы выбираете один и делите его на 2. Благодаря этому вы можете чаще разделять большой диапазон, чем меньший.
  • Используйте сетку QuadTrees на верхнем уровне. Таким образом вы разбиваете пространство на грубые квадраты, чтобы лучше использовать биты. Это также было предложено @Andreas в комментариях.
person Sorin    schedule 19.12.2013