Текстурные швы (искажения) при наложении на сферу OpenGL

При наложении текстуры на сферу получаю искажение на полюсах (рис. 1), швы вдоль сферы особо не видны, но если убрать GL_REPEAT в

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

тогда и шов появляется видимый

Из-за чего это всё, я в принципе понял, проблема заключается в том, что некоторые вершины имеют координату ~0.9, а соседние с ними 0.0, из-за этого происходят большие скачки при мипмаппинге, и появляются швы/искажения

Модельки сферы импортирую при помощи библиотеки Assimp со следующими флагами

const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

P.S. Хочу использовать именно двухмерные текстуры, а не кубические карты

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


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

Автор решения: Kromster

Вот смотрите, у вас у полюсов немного неправильная развертка получается:

  • часть текстуры не используется (пробелы между полигонами) - отсюда швы.
  • неправильная пропорция размеров полигонов - смотрите в основном на 3 последних ряда. По всей сфере высота полигонов на UV одинаковая, а верхния трия ряда "пляшут - длинный, короткий, средний, тогда как на модели, размер полигонов примерно одинаковый. Отсюда - искажения масштаба.
  • второй ряд на UV почему-то диагонально раскидан и с зазорами - отсюда на модели швы и искажения.
  • также, если вы делаете вид сверху, то надо круг полигонов на полюсе делать минимального размера (и проверять, что на текстуре пиксели равномерно раскрашены, чтобы не было заметно неизбежных швов в этой зоне).

Как быть - делать нормальную развертку. Проще всего, наверное, найти/скачать/сделать готовую модель.

Также, у правильной модели к полюсам будут не треугольники, а прямоугольники (с дегенрирующими 2 верхними точками), зато это позволит сэмплить всю текстуру.

Также, для полюсов, может быть все же проще перейти на кубические карты - в них меньше искажений/растяжек.

→ Ссылка