Введение

Метод определения деталей поверхности на компьютерной графике или 3D-модели.

Текстурирование — это метод наложения текстуры на компьютерную графику. Под текстурой здесь понимаются детали высокого разрешения, текстура поверхности или цвет.

История

Первоначальный метод был разработан Эдвином Кэтмуллом в 1974 году в рамках его докторской диссертации. Поскольку технология текстурирования в реальном времени применялась к ранним трехмерным системам CGI-симуляторов полетов, многие из этих методов впоследствии широко использовались в компьютерной графике, играх и приложениях на протяжении многих лет, так как текстуры часто были первым необходимым условием для создания реалистичной графики. Изначально текстурное отображение относилось к диффузному отображению – методу, который просто переносил пиксели из текстуры на 3D-поверхность ("накладывал" изображение на объект). В последние десятилетия, с появлением многопроходного рендеринга, мультитекстурирования, мип-карт и более сложных методов отображения, таких как картографирование высот, рельефное картографирование, нормальное картографирование, картографирование смещения, отражающее картографирование, зеркальное картографирование, картографирование затенения и множества других вариаций этой техники (управляемых системой материалов), стало возможным имитировать почти фотореалистичное изображение в реальном времени, значительно сократив количество полигонов и вычислений освещения, необходимых для создания реалистичной и функциональной 3D-сцены.

Текстура

Текстура – это изображение, наложенное (отображенное) на поверхность фигуры или многоугольника. Это может быть растровое изображение или процедурная текстура. Текстуры могут храниться в распространенных форматах файлов изображений, использоваться в форматах 3D-моделей или определениях материалов и объединяться в пакеты ресурсов. Они могут иметь от 1 до 3 измерений, хотя 2 измерения наиболее распространены для видимых поверхностей. Для использования с современным оборудованием данные текстур могут храниться в переставленном или разбитом на блоки порядке для повышения когерентности кэша. API рендеринга обычно управляют ресурсами текстур (которые могут находиться в памяти устройства) как буферами или поверхностями и могут поддерживать "рендеринг в текстуру" для дополнительных эффектов, таких как постобработка или отображение окружения. Обычно они содержат данные цвета RGB (хранящиеся как прямой цвет, сжатые форматы или индексированные цвета) и иногда дополнительный канал для альфа-смешивания (RGBA), особенно для билбордов и текстур декалей. Альфа-канал можно использовать (что удобно для хранения в форматах, обрабатываемых аппаратным обеспечением) для других целей, таких как блики. Для управления бликами, нормалями, смещением или подповерхностным рассеянием, например, при рендеринге кожи, можно комбинировать несколько текстур (или каналов). Несколько изображений текстур могут быть объединены в текстурные атласы или массивы текстур для уменьшения переключений состояний для современного оборудования. (Их можно рассматривать как современную эволюцию тайловой графики). Современное оборудование часто поддерживает кубические текстуры с несколькими гранями для отображения окружения.

Создание

Текстуры могут быть получены путем сканирования или цифровой фотографии, созданы в программах для обработки изображений, таких как GIMP и Photoshop, или нарисованы непосредственно на 3D-поверхности в 3D-редакторах, таких как Mudbox или ZBrush.

Применение текстуры

Этот процесс можно сравнить с наклеиванием узорчатой бумаги на простую белую коробку. Каждой вершине многоугольника присваиваются текстурные координаты (в двумерном случае также известные как UV-координаты). Это можно сделать путем явного присвоения атрибутов вершинам, отредактированных вручную в пакете 3D-моделирования с помощью инструментов для UV-развертки. Также возможно связать с материалом процедурное преобразование из 3D-пространства в пространство текстур. Этого можно достичь с помощью планарной проекции или, альтернативно, цилиндрической или сферической проекции. Более сложные проекции могут учитывать расстояние вдоль поверхности для минимизации искажений. Эти координаты интерполируются по граням многоугольников для выборки текстуры во время рендеринга. Текстуры могут повторяться или отражаться, чтобы расширить конечное прямоугольное растровое изображение на большую область, или они могут иметь уникальное "инъективное" соответствие для каждого участка поверхности (что важно для рендер-маппинга и лайт-маппинга, также известного как бейкинг).

Текстура

Текстурное отображение преобразует поверхность модели (или пространство экрана при растрировании) в текстурное пространство; в этом пространстве текстура отображается в неискаженном виде. Инструменты для развёртки UV-координат обычно предоставляют вид в текстурном пространстве для ручного редактирования координат текстур. Некоторые методы рендеринга, такие как рассеянное подповерхностное освещение, могут быть приближенно реализованы посредством операций в текстурном пространстве.

Многотексторизация

Мультитекстурирование — это использование нескольких текстур одновременно на полигоне. Например, текстура световой карты может использоваться для освещения поверхности вместо пересчёта этого освещения при каждом рендеринге поверхности. Микротекстуры или текстуры деталей используются для добавления высокочастотных деталей, а карты грязи могут добавлять эффекты старения и разнообразия, что значительно уменьшает заметную периодичность повторяющихся текстур. Современная графика может использовать более 10 слоёв, которые комбинируются с помощью шейдеров для достижения большей реалистичности. Другая техника мультитекстурирования — это рельефное текстурирование (bump mapping), которое позволяет текстуре напрямую управлять направлением нормали поверхности для целей расчёта освещения; это может создать очень убедительное впечатление сложной поверхности (например, коры дерева или грубого бетона), которая отображает детали освещения в дополнение к обычной детализированной цветовой окраске. Рельефное текстурирование стало популярным в современных видеоиграх, поскольку графическое оборудование стало достаточно мощным для его применения в реальном времени.

Фильтрация текстуры

Способ, которым образцы (например, при отображении в виде пикселей на экране) вычисляются из текселей (текстурных пикселей), определяется фильтрацией текстур. Наиболее дешевый метод – использование ближайшей точки интерполяции, однако билинейная интерполяция или трилинейная интерполяция между уровнями детализации (мип-картами) являются двумя часто используемыми альтернативами, которые уменьшают эффект алиасинга или ступенчатость. Если координата текстуры выходит за пределы текстуры, она либо обрезается, либо повторяется. Анизотропная фильтрация более эффективно устраняет направленные артефакты при просмотре текстур под косыми углами.

Текстура потока

Текстурное потоковое вещание — это способ использования потоков данных для текстур, при котором каждая текстура доступна в двух или более различных разрешениях. Это позволяет определить, какую текстуру загружать в память и использовать, исходя из расстояния до объекта от зрителя и объема доступной памяти для текстур. Текстурное потоковое вещание позволяет движку рендеринга использовать текстуры низкого разрешения для объектов, находящихся далеко от камеры, и заменять их на более детализированные текстуры, загружаемые из источника данных, по мере приближения к объектам.

Печь

В качестве оптимизации можно отрисовать детали из сложной модели с высоким разрешением или дорогостоящего процесса (например, глобального освещения) в текстуру поверхности (возможно, на модели с низким разрешением). Этот метод также известен как запекание текстур (render mapping). Чаще всего он используется для создания карт освещения, но также может применяться для генерации карт нормалей и карт смещения. Некоторые компьютерные игры (например, Messiah) использовали эту технику. В оригинальном программном движке Quake использовалось запекание в реальном времени для объединения карт освещения и цветовых карт ("кэширование поверхности"). Запекание текстур может использоваться как способ генерации уровней детализации, когда сложная сцена с множеством различных элементов и материалов аппроксимируется одним элементом с единственной текстурой, которая затем алгоритмически упрощается для снижения затрат на рендеринг и уменьшения количества вызовов отрисовки. Также он применяется для преобразования высокодетализированных моделей, созданных в программах для 3D-скульптинга или полученных путем сканирования облаков точек, в сетки, более подходящие для рендеринга в реальном времени.

Растрирующие алгоритмы

Различные методы были разработаны в программных и аппаратных реализациях. Каждый из них предлагает различные компромиссы между точностью, гибкостью и производительностью.

Картировка аффиновых текстур

Аффинное текстурирование линейно интерполирует координаты текстуры по поверхности и является самым быстрым методом текстурирования. Некоторые программные и аппаратные средства (например, оригинальная PlayStation) проецируют вершины в 3D-пространстве на экран во время рендеринга и линейно интерполируют координаты текстуры в экранном пространстве между ними. Это может быть реализовано путем инкрементного увеличения координат текстуры с фиксированной точкой или с помощью алгоритма инкрементной ошибки, аналогичного алгоритму построения линии Брезенхема. В отличие от перпендикулярных полигонов, это приводит к заметным искажениям при перспективных преобразованиях (см. рисунок: текстура в виде шахматной доски выглядит искривленной), особенно для примитивов, находящихся близко к камере. Эти искажения можно уменьшить, разделив полигон на более мелкие. Для прямоугольных объектов использование четырехугольных примитивов может выглядеть более корректно, чем разделение того же прямоугольника на треугольники, но поскольку интерполяция 4 точек усложняет растризацию, большинство ранних реализаций предпочитали использовать только треугольники. Некоторые аппаратные средства, такие как прямое текстурирование, используемое Nvidia NV1, могли предлагать эффективные четырехугольные примитивы. При коррекции перспективы (см. ниже) треугольники становятся эквивалентными, и это преимущество исчезает. Для прямоугольных объектов, расположенных перпендикулярно зрителю, таких как полы и стены, перспективу необходимо корректировать только в одном направлении по экрану, а не в обоих. Корректное перспективное отображение можно вычислить на левом и правом краях пола, а затем аффинная линейная интерполяция вдоль этого горизонтального отрезка будет выглядеть правильно, поскольку каждый пиксель на этой линии находится на одинаковом расстоянии от зрителя.

Ограничение вращения камеры

Двигатель Doom ограничивал мир вертикальными стенами и горизонтальными полами/потолками, а камера могла вращаться только вокруг вертикальной оси. Это означало, что стены имели постоянную координату глубины вдоль вертикальной линии, а полы/потолки – постоянную координату глубины вдоль горизонтальной линии. После выполнения одного вычисления коррекции перспективы для глубины, остальная часть линии могла использовать быстрое аффинное преобразование. Некоторые более поздние графические движки этой эпохи имитировали небольшой наклон камеры с помощью сдвига, что создавало иллюзию большей свободы, сохраняя при этом ту же технику рендеринга. Некоторые движки могли отображать текстурированные карты высот (например, Voxel Space от Nova Logic и движок Outcast) с помощью инкрементальных алгоритмов, подобных алгоритму Брезенхема, создавая вид текстурированного ландшафта без использования традиционных геометрических примитивов.

Подразделение для коррекции перспективы

Каждый треугольник может быть дополнительно разделен на группы примерно из 16 пикселей для достижения двух целей. Во-первых, чтобы вычислительное устройство было постоянно загружено работой. Во-вторых, для получения более быстрых результатов вычислений.

Всемирный космический подраздел

Для перспективной текстурной проекции без аппаратной поддержки, треугольник разбивается на более мелкие треугольники для рендеринга, и на них применяется аффинное преобразование. Эта техника работает, потому что искажения аффинного преобразования становятся менее заметными на маленьких полигонах. Sony PlayStation активно использовала этот метод, поскольку аппаратная поддержка была только для аффинного преобразования, но при этом пропускная способность треугольников была относительно высокой по сравнению с конкурентами.

Разделение экрана

Программные рендереры обычно предпочитали разделение экрана из-за меньших накладных расходов. Кроме того, они стремились использовать линейную интерполяцию вдоль линии пикселей для упрощения настройки (по сравнению с двумерной аффинной интерполяцией) и, следовательно, снижения накладных расходов (аффинное текстурирование также не помещалось в небольшое количество регистров процессора x86; процессоры 68000 или любой RISC были гораздо более подходящими). В Quake был применен иной подход: перспективно-корректные координаты вычислялись лишь раз на каждые 16 пикселей строки развертки, а между ними выполнялась линейная интерполяция, что фактически обеспечивало скорость линейной интерполяции, поскольку вычисление перспективно-корректных координат выполнялось параллельно на сопроцессоре. Полигоны рендерились независимо, поэтому теоретически можно было переключаться между горизонтальными и вертикальными полосами или диагональными направлениями в зависимости от ориентации нормали полигона для достижения более стабильного значения Z, но, по-видимому, это не оправдывало затраченных усилий.

Другие методы

Другой метод заключался в приближении перспективы с помощью более быстрого вычисления, например, с использованием полинома. Еще один метод использует значение 1/z двух последних отрисованных пикселей для линейной экстраполяции следующего значения. Деление затем выполняется, начиная с этих значений, так что приходится делить лишь небольшое остаточное значение, однако большой объем вычислений делает этот метод слишком медленным на большинстве систем. Наконец, движок Build расширил прием с постоянным расстоянием, использовавшийся в Doom, найдя линию постоянного расстояния для произвольных многоугольников и выполняя рендеринг вдоль этой линии.

Картировка инверсной текстуры

При этом методе пиксель на экране сопоставляется с точкой на текстуре. Каждая вершина элемента примитива проецируется в точку на экране, и каждая из этих точек сопоставляется с координатой u,v текселя на текстуре. Растеризатор интерполирует между этими точками, чтобы заполнить каждый пиксель, покрытый примитивом. Основное преимущество заключается в том, что каждый пиксель, покрытый примитивом, будет обработан ровно один раз. После преобразования вершин примитива объем оставшейся работы напрямую зависит от количества пикселей, которые примитив покрывает на экране. Главный недостаток по сравнению с прямым отображением текстур заключается в том, что схема доступа к памяти в пространстве текстур не будет линейной, если текстура расположена под углом к экрану. Этот недостаток часто решается с помощью методов кэширования текстур, таких как организация памяти текстуры с перестановкой. Линейная интерполяция может быть использована непосредственно для простого и эффективного аффинного отображения текстур, но также может быть адаптирована для обеспечения перспективной корректности.

Картировка текстуры вперед

Прямое текстурирование отображает каждый тексель текстуры на пиксель на экране. После преобразования прямоугольной примитивной фигуры на место на экране, рендерер прямого текстурирования перебирает каждый тексель текстуры, "разбрызгивая" его на пиксель фреймбуфера. Этот метод использовался в некоторых аппаратных средствах, таких как 3DO, Sega Saturn и NV1. Основное преимущество заключается в том, что текстура будет доступна в простом линейном порядке, что позволяет очень эффективно кэшировать данные текстуры. Однако это преимущество является и его недостатком: по мере уменьшения размера примитивной фигуры на экране, рендерер все равно должен перебирать каждый тексель текстуры, что приводит к избыточному перекрытию многих пикселей. Этот метод также хорошо подходит для рендеринга четырехугольных примитивов, а не их разбиения на треугольники, что давало преимущество, когда аппаратная поддержка перспективно-корректной текстуры была недоступна. Это связано с тем, что аффинное искажение четырехугольника выглядит менее заметным, чем тот же четырехугольник, разделенный на два треугольника (см. выше аффинное текстурирование). Аппаратное обеспечение NV1 также поддерживало квадратичную интерполяцию для еще более точного приближения перспективной корректности. Существующие аппаратные реализации не обеспечивали эффективное сопоставление UV-координат, которое стало важным методом для 3D-моделирования и помогало правильно обрезать текстуру, когда примитивная фигура выходит за пределы экрана. Эти недостатки можно было бы устранить дальнейшей разработкой, но дизайн графических процессоров с тех пор в основном перешел к обратному отображению.

Томография

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

Пользовательские интерфейсы

Многие пользовательские интерфейсы используют текстурирование для ускорения анимированных переходов элементов экрана, например, Exposé в Mac OS X.