КГ_5глава (1024112), страница 3
Текст из файла (страница 3)
Недостатком рассмотренного способа является низкая скорость построения изображения, поскольку для каждого пиксела основного растра нужно выполнять несколько вычислительных операций, требующих много машинного времени — в первую очередь, это арксинус и арктангенс.
Разумеется, приведенный выше алгоритм можно усовершенствовать с целью повышения быстродействия. Так, например, можно использовать симметрию шара, что позволяет совместить вычисления для нескольких точек поверхности одновременно. Однако все равно приходится вычислять арксинусы и арктангенсы наряду с другими операциями с плавающей точкой.
Здесь мы рассмотрели подход, основной идеей которого было получение формул преобразования координат изображения в мировые координаты и далее — в текстурные. Формулы преобразования здесь достаточно просты с точки зрения математики, но не слишком удобны для быстрых вычислений. Необходимо отметить, что такие формулы мы получили для, возможно, простейшего объемного объекта — шара. Для других типов поверхностей, которые описываются значительно более сложными формулами, вероятно, и не существует решение в точном аналитическом виде такой задачи, как пересчет координат плоскости проецирования в мировые трехмерные. Сложность решения обуславливается сложностью формул аналитического описания поверхности. И не только. Например, для эллипсоида формулы описания поверхности не намного сложнее, чем для шара. Однако определение значения координаты Z по известным X н Y является гораздо более сложной задачей, поскольку видимые точки эллипсоида могут иметь как положительные, так и отрицательные значения координаты Z.
Значительно более универсальным и, как правило, более эффективным по быстродействию можно считать метод текстурирования, использующий представление поверхностей полигональными гранями.
Наложение текстуры на многогранник
Рассмотрим наложение растровой текстуры на шар, аппроксимированный многогранником. В главе 3 мы с вами уже обсуждали способы вывода полигонов с наложением текстуры. Эти способы были представлены в обобщенном виде. Здесь мы разберемся с некоторыми особенностями наложения текстуры для шара.
Пусть в качестве текстуры будет карта, которую мы уже рассматривали выше. Кстати, во многих англоязычных графических пакетах программ файлы текстур так и называются "maps", хотя и не представляют собой продукцию картографии. Термин "карта" для текстур можно еще трактовать как "развертка".
| В нашем случае каждая грань многогранника будет соответствовать одной | прямоугольной клетке текстуры (рис. 5.12).
Рис. 5.12. Наложение фрагмента растра текстуры на одну грань
Для рисования каждой грани можно использовать алгоритм вывода полигонов, модифицированный следующим образом. Мы уже рассматривали выше в главе 3 один из алгоритмов вывода полигонов, который рисует полигон горизонталями заполнения внутренних точек. Операции по наложению текстуры удобно встроить в цикл рисования каждой такой горизонтали. При этом в ходе вывода пиксела горизонтали по известным текущим координатам пиксела в основном растре (X, Y) определяются соответствующие координаты (XТ У Т) тексела в растре текстуры. Затем определяется цвет тексела, который и будет определять цвет пиксела в основном растре. Вычислить координаты (х Т, у Т) для каждой точки грани можно следующим образом. Рассмотрим рис. 5.13.
Для определения искомых координат в точке горизонтали будем использовать линейную интерполяцию координат угловых точек. При этом до начала цикла вывода горизонтали определим текстурные координаты в точках А и В — (хта, Ута) и (хТв, Утв)- Это можно сделать, разделив отрезки (0-1) и (2-3) пропорционально Y.
Рис. 5.13. Соответствие угловых точек грани и фрагмента текстуры Запишем пропорции:
В ходе цикла вывода горизонтали вычисление координат (х Т, у Т), соответствующих текущим пикселам горизонтали, можно выполнять делением отрезка (А-В) пропорционально X:
Следует учесть, что приведенные выше формулы отражают лишь отдельный эпизод в ходе заполнения полигона грани. Очевидно, что в другие моменты времени горизонталь заполнения будет пересекать иные ребра полигона (а им будут соответствовать свои индексы вершин). Это достаточно просто реализуется в алгоритмах заполнения полигонов — в том числе и в алгоритме, приведенном в главе 3 этой книги.
Как вы, наверное, уже заметили, интерполяция координат для такой текстурированной грани аналогична интерполяции интенсивностей отраженного света для метода Гуро. Кстати, если в цикл вывода горизонтали заполнения встроить и интерполяцию по методам Гуро или Фонга, то можно получить более реалистичное текстурированное изображение — с учетом отражения света (рис. 5.14).
Необходимо принимать во внимание, что линей-
Рис. 5.14. Текстура ная интерполяция текстурных координат вершин и интерполяция Гуро граней (х Тi, у Тi) вносит погрешность. Эта погрешность значительно возрастает, если соотношение
угловых координат (B, L) и (х Т, у Т) для текстуры карты мира нелинейно — а это так для многих проекций карты мира. В этом случае для уменьшения погрешности отображения целесообразно увеличивать число граней. Можно интерполировать не текстурные координаты, а широту и долготу (B, L), и для них потом в каждой точке горизонталей заполнения находить соответствующие значения (х Т, у Т) — это уже чем-то напоминает метод Фонга, не так ли?
Давайте рассмотрим еще один способ наложения текстур на многогранник. В отличие от только что рассмотренного, здесь не используется интерполяция. При интерполяции требуется выполнять достаточно много операций, в том числе операции деления. Избавиться от достаточно медленной операции деления (в общем случае — над числами с плавающей точкой) можно, если
для каждого полигона грани определить формулы преобразования координат (X, Y) в (х Т, у Т) в виде
причем, коэффициенты а, b, с, d, e и f являются константами в течение всего цикла вывода одной грани.
В общем случае для четырехугольной грани это невозможно.
Подобное аффинное преобразование нельзя построить по четырем точкам соответствия четырехугольников текстуры и четырехугольника грани, ориентированной произвольным образом. Преобразование формы прямоугольного фрагмента текстуры в форму четырехугольной грани многогранника значительно сложнее — попробуйте, например, выразить процесс интерполяции для рассмотренного выше способа в одной функциональной зависимости (х Т, y Т) = F(X, Y) и вы увидите, что она является сложной, нелинейной.
Однако можно представить четырехугольник в виде двух треугольников] (рис. 5.15), а каждый треугольник выводить отдельно. Для каждой треугольной грани перед циклом заполнения нужно определять свои коэффициенты преобразования координат. Сделать это можно по трем точкам вершин треугольника. Рассмотрим треугольник (0-1-2). Очевидно, должны выполняться следующие равенства.
Рассматривая эти равенства как две системы линейных уравнений третьего порядка относительно {а, b, с) и (d, e, f), можно найти искомые коэффициенты преобразования — подобно тому, как это сделано в разд. 3.7.
Следует заметить, что использовать такой способ триангуляции здесь следует только при большом числе граней, поскольку имеется значительная методическая погрешность. Преимуществом данного способа наложения текстуры является простота вычислительных операций в цикле вывода каждого полигона. В некоторых случаях это позволяет достичь высокой скорости графики.
рСотя теперь полигонов уже почти вдвое больше (грани, примыкающие к полюсам, и так были треугольными), но треугольники обычно выводятся быстрее четырехугольников. Для треугольников часто используют особые алгоритмы, оптимизированные по быстродействию. Кроме того, в цикле вывода грани можно использовать, в основном, целочисленные операции, если соответствующим образом применять коэффициенты аффинного преобразования координат.
Теперь сделаем замечания общего характера по текстурированию.
При наложении текстуры на отдельные грани шара совершенно необязательным является склеивание карты мира в один растр текстуры. Может оказаться удобным для каждой грани иметь отдельную текстуру. Это относится и к случаю, когда текстуры хранятся в файлах.
Для построения реалистичного изображения поверхности Земли в качестве текстуры лучше всего использовать космические снимки, трансформированные надлежащим образом.
Достоинством полигонального текстурирования поверхностей является универсальность метода, применимость его к самым разнообразным поверхностям, которые могут быть представлены многогранниками и полигональными сетями. Еще одним достоинством является высокая скорость графики. Базовые операции текстурирования граней в настоящее время аппаратно поддержаны многими графическими процессорами для видеоадаптеров.
1 Недостатком метода является погрешность отображения, которая, однако, стремится к нулю при увеличении числа граней.
Вариации формы шара
Обозначим через хш уш, zш координаты точек поверхности шара. Будем, как и прежде, использовать параметрическую форму — функции угловых координат широты и долготы:
Рассмотрим варианты деформации поверхности шара, которые можно описать следующим образом: