### Создание иконок в формате PNG без потери качества
Чтобы создать иконки в формате PNG без потери качества при изменении масштаба, лучше всего начать с векторного изображения, используя программы вроде Adobe Illustrator, Inkscape или другие векторные редакторы. Векторные изображения не теряют в качестве при масштабировании, так как они основаны на математических уравнениях, описывающих формы и линии. Векторный исходник можно экспортировать в PNG с требуемым разрешением (например, 256x256).
### Отображение мировой карты в OpenGL с фиксированными иконками
Чтобы отобразить иконки на мировой карте с использованием OpenTK и modern OpenGL таким образом, чтобы их размер не изменялся при масштабировании, можно использовать следующий подход:
1. **Создание квада для иконки**: Для каждой иконки, которую вы хотите отобразить на карте, вы создаете квад (четырехугольник), который будет использоваться для отрисовки текстурной иконки.
2. **Определение мировых координат**: Каждый квад должен быть привязан к точке на карте с использованием мировых координат (широта, долгота).
3. **Преобразование мировых координат в экранные**: При использовании камеры или какого-либо вида проецирования необходимо преобразовать мировые координаты в экранные координаты. Это может быть реализовано через систему `MVP` (Model-View-Projection) матриц.
4. **Отрисовка иконок на квадах**: Используя шейдеры, вы рисуете каждый квад с текстурой иконки, привязывая их к определенной экранной позиции. Это можно сделать, установив для квадов размер в пикселях и учтя это в shaders.
5. **Фиксирование размера иконок**: Чтобы гарантировать, что размер иконок остается фиксированным при масштабировании карты, нужно игнорировать обычные преобразования проецирования для мировых координат. Вместо этого нужно выполнить трансформацию, которая будет рассматривать размер экрана и масштабирование в игровом мире, чтобы правильно рассчитать позицию иконок на экране, но оставить размер иконки неизменным.
Вершинный шейдер может выглядеть примерно так:
```glsl
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace; // Мировая позиция вершины
uniform mat4 projectionMatrix; // Матрица проекции
uniform mat4 viewMatrix; // Матрица вида
uniform vec2 iconSize; // Размер иконки в пикселях
uniform vec2 screenSize; // Размер экрана в пикселях
void main() {
vec4 worldPos = vec4(vertexPosition_modelspace, 1.0);
vec4 screenPos = projectionMatrix * viewMatrix * worldPos;
// Преобразование в нормализованные координаты устройства (NDC)
screenPos.xy /= screenPos.w;
// Смещение на размер иконки с учетом размера экран