Я написал алгоритм, который генерирует икосаэдр (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, чтобы не было "гармошки" на стыке.
Комментариев нет:
Отправить комментарий