У меня есть следующая проблема при попытке отобразить UV-координаты на сферу
Вот код, который я использую, чтобы получить мои UV-координаты
glm::vec2 calcUV( glm::vec3 p)
{
p = glm::normalize(p);
const float PI = 3.1415926f;
float u = ((glm::atan(p.x, p.z) / PI) + 1.0f) * 0.5f;
float v = (asin(p.y) / PI) + 0.5f;
return glm::vec2(u, v);
}
Вопрос был очень хорошо объяснен в этом stackoverflow вопрос, хотя, я все еще не понимаю, как я могу это исправить. Из того, что я читал, я должен создать дубликат пары вершин. Кто-нибудь знает какой-нибудь хороший и эффективный способ сделать это?
Ваша проблема в том, что в шве ваши координаты текстуры «возвращаются» к 0, так что вы получаете всю текстуру, отображенную на зеркальном шве. Чтобы избежать этого, вы должны использовать GL_WRAP
режим повтора и в конце шва вершины с текстурными координатами >= 1
(не возвращайтесь к 0). Помните, что вершина состоит из целого набора всех ее атрибутов, а вершины с разными значениями атрибутов в целом различны, поэтому нет смысла пытаться «делиться» вершинами.
Другой способ сделать это — просто передать координаты объекта сферы в пиксельный шейдер и вычислить ультрафиолетовое излучение в «идеальном» сферическом пространстве.
Помните, что вам нужно будет передать локальные производные, чтобы вы не просто сократили шов с нескольких пикселей до одного.
Иначе да. Вам нужно дублировать вершины вдоль того же ребра, что и u = 0, и аналогично повторить вершины на полюсах. Таким образом, топология вашего объекта станет прямоугольником: так же, как ваша текстура.