Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как сделать бесшовную UV развертку шара (икосаэдра)?

Я написал алгоритм, который генерирует икосаэдр (20 граней, 12 вершин). Далее, применяя метод бисекции к каждому треугольнику нужное количество раз, я получаю сферу нужного "качества". Если данную модель скормить простому шейдеру, то можно увидеть качественный кругленький шарик. Проблемы пошли когда я назначил каждой вершине текстурные координаты и начал семплинг.
Про сферу я рассказал чтобы не было вопросов "зачем" и "почему", а проблема есть даже если оборачивать текстурой икосаэдр, так что для простоты вернусь к этой фигуре.
Текстура это прямоугольник, если этим прямоугольником оборачивать икосаэдр то будет некая условная линия стыка начала и конца прямоугольника текстуры. Линия этого стыка будет проходить через некоторые треугольники икосаэдра. Я не могу понять какие текстурные координаты задавать вершинам такого треугольника. Мы не можем "сместить" текстурные координаты этих верши в начало текстуры или в конец, так как на этих вершинах построены другие треугольники и с ними все в порядке.
Решений я вижу два.
Первое это изменить метод генерации шара так, чтоб у нас вершины на шаре образовывали дуги, к которым я смогу привязать линию стыка текстуры Второе это треугольники на линии стыка разбить на другие треугольники, чтоб вершины были четко на линии стыка, у них были одинаковые мировые координаты, но разные текстурные координаты.
Какой из методов лучше?


Ответ

Есть третий, гораздо более правильный метод:
Вам надо включить "повтор" текстур при выходе за диапазон UV 0..1.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Ось U glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Ось V
Есть 4 основных типа повтора, вам нужен GL_REPEAT по оси U.

И соответственно сделать разветку по типу

Не забудьте сделать разрыв в полигонах по разрыву на UV, чтобы не было "гармошки" на стыке.

Комментариев нет:

Отправить комментарий