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