Текстурирование полигонов повторяющейся текстурой. (Тайлинг)
В картографическом приложении необходимо некоторые области текстурировать паттерном. Для этих целей прикрепляю текстуру, а текстурные координаты рассчитываю непосредственно в вершинном шейдере.
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

