Как нарисовать и текстурировать UV-сферу с помощью OpenGL 2.0 для Android

Я создаю приложение виртуальной реальности для Android, и я хотел бы создать сферу в openGL для своих целей. На первом этапе я нашел этот поток (Draw Sphere - порядок вершин), где в первом ответе есть хороший учебник о том, как рендерить сферу в автономном режиме. В том же ответе есть пример кода сферы (http://pastebin.com/4esQdVPP) которую я использовал для своего приложения, а затем я успешно наложил 2D-текстуру на сферу.

Однако этот образец сферы имеет плохое разрешение, и я хотел бы сгенерировать его получше, поэтому я продолжил следовать некоторым руководствам по блендеру, чтобы сгенерировать сферу, а затем экспортировать файл .obj и просто взять координаты точки, индексировать и проанализировать их в Java-код.

Проблема при этом заключается в том, что когда текстура добавлена, она выглядит сломанной на полюсах сферы, в то время как в остальной части сферы она выглядит хорошо (пожалуйста, взгляните на следующие изображения). Изображение Южного полюсаСеверный полюс Вид спереди

Я не знаю, что я делаю неправильно, так как алгоритм отображения текстуры должен быть таким же, поэтому я предполагаю, что, возможно, проблема в индексе сгенерированных точек. Это алгоритм, который я использую для отображения текстуры: https://en.wikipedia.org/wiki/UV_mapping#Finding_UV_on_a_sphere

Это файл .obj, автоматически сгенерированный блендером: http://pastebin.com/uP3ndM2d

И оттуда мы извлекаем индекс и координаты: Это индекс точки: http://pastebin.com/rt1QjcaX< /а>

А это координаты точки: http://pastebin.com/h1hGwNfx

Не могли бы вы дать мне несколько советов? Есть ли что-то, что я делаю неправильно?


person Jorge S    schedule 18.11.2015    source источник
comment
Добро пожаловать в SO, пожалуйста, добавьте несколько примеров кода, чтобы сообщество могло помочь :)   -  person Can O' Spam    schedule 18.11.2015


Ответы (2)


Прежде всего, необходимо с осторожностью подходить к определению координат текстуры на полюсах (или даже рядом с ними). Использование UV-алгоритма, предложенного для координаты s на полюсе, не даст вам того, что вы хотите, с выбранной вами тесселяцией (например, s = 0,5 + arctan2(1,0)/(2*pi) будет использоваться для всех точки на северном полюсе). На изображении ниже вершины M+1 в верхнем ряду представляют одну и ту же вершину на северном полюсе — каждая из них будет иметь одинаковое значение t, но должна иметь разные значения s для координат текстуры:

введите здесь описание изображения

Во-вторых, использование этого типа тесселяции приведет к проблемам алиасинга вблизи полюсов, поскольку небольшое расстояние между соседними фрагментами создает большую разницу между значениями s. Вы должны максимально уменьшить алиасинг, используя фильтр mipmap. Следующие изображения показывают меркаторскую проекцию земли и вертикальные красные полосы, текстурированные на сфере (полосы — хороший пример):

введите здесь описание изображения введите здесь описание изображениявведите здесь описание изображения

Лучшее замощение сферы состоит в том, чтобы разделить икосаэдр, который даст почти равносторонние треугольники. Вот пример сферы с нормальным отображением, которая позволяет избежать этих проблем с наложением имен:

введите здесь описание изображениявведите здесь описание изображения

person wcochran    schedule 19.11.2015
comment
Спасибо за ваш ответ. Я ценю это. Однако я не совсем понимаю вашу точку зрения и не вижу, как это может решить мою проблему. Я имею в виду, вы предполагаете, что алгоритм UV, который я использую, не будет работать с теселяцией, которую я использую, однако он действительно работает для образца сферы, который я скопировал отсюда pastebin.com/4esQdVPP. У меня есть работающее приложение, в котором текстура идеально наложена на эту сферу, и я просто меняю сферу (оставляя все остальное как есть). Я не уверен, но я думаю, что некоторые тессели сгенерированы неправильно, соединяя некоторые точки с северного и южного полюсов. - person Jorge S; 20.11.2015
comment
UV-алгоритм отлично работает везде, кроме значений s на полюсах — я добавил уточнение. - person wcochran; 20.11.2015

Хорошо, теперь проблема решена. Текстуры не работали должным образом, потому что сгенерированные индексы точек начинаются с 1 вместо 0. Вычитая 1 из всех индексов, проблема решается... :)

person Jorge S    schedule 23.11.2015