Текстурирование полигонов повторяющейся текстурой. (Тайлинг)

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

void main() {

    gl_Position = u_mvp*vec4(project(a_position), 0, 1);

    v_coord.x = a_position.x*u_proj_scale/u_tex_size.x;
    v_coord.y = 1.0 -a_position.y*u_proj_scale/u_tex_size.y;
}

где vec2 u_tex_size = размер текстуры, и float u_proj_scale - масштаб проекции.

Параметры текстуры таковы:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

В принципе, текстура накладывает правильно, но видны какие-то артефакты, которые усиливаются при повороте камеры и увеличении масштаба проекции u_proj_scale. Артефакты не искажают геометрию текстуры, они больше похожи на эффект сильного сжатия jpeg. Точности что ли где-то не хватает? Не знаю как решить это проблему.

На первом изображении видны артефакты(которые станут еще сильнее, при увеличении проекции), на втором - то, как должно быть (здесь рендеринг при помощи QPainter, т.е. не OpenGL, но текстура таже).

введите сюда описание изображениявведите сюда описание изображения

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

v_coord.x = (a_position.x-u_origin.x)*u_proj_scale/u_tex_size.x;
v_coord.y = 1.0 -(a_position.y-u_origin.y)*u_proj_scale/u_tex_size.y;

Также добавил короткий ролик, а котором видна проблема в динакике: https://cloud.mail.ru/public/tA9y/Ko1xpB478


Ответы (0 шт):