Короткая версия
Как рисовать короткие текстовые метки в приложении отображения OpenGL без необходимости вручную пересчитывать координаты при увеличении и уменьшении масштаба пользователя?
Длинная версия
У меня есть картографическое приложение на основе OpenGL, где мне нужно иметь возможность рисовать наборы данных с количеством точек около 250 тыс. Каждая точка может иметь короткую текстовую метку, обычно длиной около 4 или 5 символов.
В настоящее время я делаю это, используя один текст, содержащий все символы. Для каждой точки я определяю квад для каждого символа в его метке. Таким образом, точка с меткой «Fred» будет иметь четыре квада, связанные с ней, и каждый квад использует координаты текстуры в этой единственной текстуре, чтобы нарисовать соответствующий ей символ.
Когда я рисую карту, я рисую сами точки карты в координатах карты (например, долгота / широта). Затем я вычисляю положение каждой точки в экранных координатах и обновляю четыре угловые точки для каждого из квадов меток этой точки, опять же в экранных координатах. (Например, если я определю, что точка нарисована в точке экрана 100, 150, я мог бы установить квадратом для первого символа в метке точки, чтобы он был прямоугольником, начинающимся с левой верхней точки 105, 155 и имеющим ширину 6 пикселей и высота 12 пикселей, в зависимости от конкретного символа. Затем второй символ может начинаться с 120, 155 и т. Д.) Затем, как только все эти квадраты символов метки расположены правильно, я рисую их с использованием ортогонального экрана проекция.
Проблема в том, что процесс обновления всех этих четырехугольных координат символов идет медленно, занимая около полсекунды для конкретного набора тестовых данных с 150k точек (это означает, что, поскольку каждая метка имеет длину около четырех символов, существует около 150k * [4 символа на точку] * [4 пары координат на символ] пары координат, которые необходимо установить при каждом обновлении.
Если бы приложение карты не включало масштабирование, мне не пришлось бы пересчитывать все эти координаты при каждом обновлении. Я мог бы просто вычислить координаты метки один раз, а затем просто сместить прямоугольник просмотра, чтобы показать правильную область. Но с масштабированием я не могу понять, как заставить его работать без выполнения координатных вычислений, потому что в противном случае символы увеличиваются при увеличении и уменьшаются при уменьшении.
То, что я хочу (и то, что, как я понимаю, OpenGL не предоставляет), это способ сказать OpenGL, что квадрат должен быть нарисован в фиксированном прямоугольнике с координатами экрана, но что верхняя левая позиция этого прямоугольника должна быть фиксированное расстояние от заданной точки в координатном пространстве карты. Поэтому я хочу и примитивную иерархию (данная точка карты является родителем его четырехугольников символов метки) и возможность смешивать две разные системы координат в этой иерархии.
Я пытаюсь понять, есть ли какая-то волшебная матрица преобразования, которую я могу установить, которая будет делать все это из меня, но я не понимаю, как это сделать.
Другой альтернативой, которую я рассмотрел, является использование шейдера в каждой точке для обработки вычисления четырехугольных координат символов метки для этой точки. Я раньше не работал с шейдерами, и я просто пытаюсь понять (а), возможно ли использовать шейдеры для этого, и (б) действительно ли вычисление всех этих точек в шейдерном коде дает мне что-нибудь по сравнению с их вычислением самостоятельно , (Между прочим, я подтвердил, что большое узкое место - вычисление четырехугольных координат, а не загрузка обновленных координат в графический процессор. Последнее занимает немного времени, но это вычисление, огромное количество обновляемых координат, что занимает большую часть этой половины секунды.)
(Конечно, другая другая альтернатива - это быть более умным в отношении того, какие метки нужно рисовать в данном виде в первую очередь. Но сейчас я бы хотел сосредоточиться на решении, предполагая, что все метки должны быть нарисованы .)