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

238
03 июля 2022, 02:30

При наложении текстуры на сферу получаю искажение на полюсах (рис. 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. Хочу использовать именно двухмерные текстуры, а не кубические карты

Answer 1

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

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

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

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

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

READ ALSO
Вывод списка процессов Windows 10 в компонент Qt

Вывод списка процессов Windows 10 в компонент Qt

При написании курсового проекта столкнулся с проблемой: при нажатии на компонент MenuBar у меня не происходит вывод значений на компонент TableWidget...

236
QListWidget проверка на выделение

QListWidget проверка на выделение

Как правильно организовать проверку на выделение какого-либо элемента QListWidgetВ пример прилагаю мой QListWidget с таймерами - элементами списка

407