текстурирование glutSolidSphere - PullRequest
4 голосов
/ 24 ноября 2011

Мне нужно добавить текстуру земли в glutSolidSphere.Проблема в том, что я не могу понять, как заставить текстуру растягиваться по всей сфере и при этом иметь возможность вращаться.

Мы включаем текстуры с помощью.

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);

glEnable(GL_TEXTURE_2D);

glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);

//drawcode...

с использованием GL_SPHERE_MAP в параметре вместо GL_OBJECT_LINEAR заставляет текстуры выглядеть правильно, но они не могут вращаться.

Параметры, которые я использую для текстуры:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Я понимаю, что GL_REPEAT накладывает текстуру на мозаику, а использование GL_CLAMP вместо этого дает мне один раз текстуру объекта, но я не могу заставить ее растягиваться по всей сфере.

Кто-нибудь знает, как правильно текстурировать glutSolidSphere?

1 Ответ

5 голосов
/ 24 ноября 2011

glutSolidSphere не обеспечивает правильные координаты текстуры, а встроенная в генерацию текстуры OpenGL позволяет только линейные отображения от положения вершины к координате текстуры вершины, что по сути означает, что вы не можете использовать их для текстурирования 3-сферы с2-плоская, ограниченная текстура (для математического объяснения ищите темы топология многообразий и теория карт ).

Так что вы можете сделать?Существует несколько возможных решений:

  • Не используйте glutSolidSphere , но есть другой генератор геометрии, который обеспечивает правильные координаты текстуры (хотя при текстурировании сферы простоодиночная ограниченная 2D текстура - сложная тема, есть несколько отображений, каждое со своими проблемами)

  • Использовать текстуру с той же топологией, что и сфера, карта куба , тогда вы можете использовать GL_NORMAL_MAP для режима генерации текстуры, то есть

    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
    glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP);
    

    Посмотрите учебники по отображению куба.Но, по сути, карта куба состоит из 6 граней текстуры, расположенных в кубе относительно начала координат, а координаты текстуры - это не точки на самом кубе, а направление от источника и адресуемый тексель - это то место, где луч направления пересекаетсяс кубом.

  • Используйте вершинный шейдер, генерируя текстурные координаты из позиций вершин.Поскольку вершинный шейдер является свободно программируемым, отображение не обязательно должно быть линейным.Конечно, мы столкнемся с особенностями отображения 3-сферы с ограниченной 2-плоской снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...