Лекция
Привет, Вы узнаете о том , что такое наложение текстур, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое наложение текстур , настоятельно рекомендую прочитать все из категории Компьютерная графика.
Текстура ( англ. Texture mapping ) — это способ придания поверхности 3D детали — полигона : цвета, фактуры, блеска, матовости и других физических свойств (для имитации чаще всего какого-либо природного материала, например бумаги, дерева, камня, металла и т.п.).
Понятие "текстура" является важным элементом 3D-моделирования, поскольку позволяет воспроизвести также малые объекты поверхности, создание которых полигонами оказалось бы чрезмерно ресурсоемким. Например, шрамы на коже, складки на одежде, мелкие камни, предметы на поверхности стен и грунта и многое другое. Итак, текстура используется для заполнения поверхностей объектов и в качестве слоя для придания определенного эффекта или изменения геометрии всему изображению или его части.
Текстуры бывают шовные и бесшовные ( паттерны или узоры). Главное отличие последних в том, что при сочетании одних и тех же фрагментов поверхность остается цельной.
Качество поверхности текстуры определяется текселями – количеством пикселей на минимальную единицу текстуры. Поскольку сама по себе текстура является изображением, разрешение текстуры и ее формат играют большую роль, которая впоследствии сказывается на общем впечатлении качества графики в 3D -приложении.
Создание параметров материала осуществляется посредством использования карт (изображения) расположенных в соответствующих каналах, либо с помощью процедурных карт , а также смешанного метода.
Наложение текстуры — это метод наложения текстуры на компьютерную графику . «Текстура» в этом контексте может быть высокочастотной детализацией , текстурой поверхности или цветом .
Наложение двухмерной текстуры на трехмерную модель
1: 3D-модель без текстур
2: Та же модель с текстурами
Карта текстуры применяется для создания определенного параметра визуального отображения поверхности заданной формы. Этот процесс напоминает применение узорчатой бумаги на обычной белой коробке. Каждой вершине в 3D модели присваивается координаты текстуры (которая в случае 2D известна как UV координата). Места отбора проб изображения впоследствии интерполируются по поверхности модели с получением визуального результата.
Чаще всего это файл растрового (реже векторного) изображения с расширением JPEG , PNG или PAT.
Первоначальная методика была впервые предложена Эдвином Кэтмеллом в 1974 году в рамках его докторской диссертации.
Текстурное отображение изначально относилось к диффузному отображению , методу, который просто отображал пиксели из текстуры на 3D-поверхность («оборачивая» изображение вокруг объекта). В последние десятилетия появление многопроходного рендеринга, мультитекстурирования , MIP-карт и более сложных отображений, таких как отображение высот , отображение рельефа , отображение нормалей , отображение смещения , отображение отражения , отображение зеркального отражения , отображение окклюзии и многих других вариаций техники (управляемых системой материалов ) сделали возможным моделирование почти фотореализма в реальном времени за счет значительного сокращения количества полигонов и расчетов освещения, необходимых для построения реалистичной и функциональной 3D-сцены.
Примеры мультитекстурирования :
1: Нетекстурированная сфера, 2: Текстура и карты рельефа, 3: Только карта текстуры, 4: Карты непрозрачности и текстуры
Пример работы мультитекстуры на объекте: 1. Сфера на которую наложена: 2. Diffuse и bump карты; 3. Diffuse карта только; 4: Opacity и Diffuse карты.
АКарта текстуры — это изображение, нанесенное (отображенное) на поверхность формы илимногоугольника. Это может бытьрастровое изображениеилипроцедурная текстура. Они могут храниться в общихформатах файлов изображений, ссылаться наформаты 3D-моделейилиопределения материалови собираться впакеты ресурсов.
Они могут иметь от одного до трех измерений, хотя для видимых поверхностей чаще всего используются два измерения. Для использования с современным оборудованием данные текстурных карт могут храниться в свизлированных или плиточных порядках для улучшения согласованности кэша . API рендеринга обычно управляют ресурсами текстурных карт (которые могут находиться в памяти устройства ) как буферами или поверхностями и могут разрешать « рендеринг в текстуру » для дополнительных эффектов, таких как постобработка или отображение среды .
Они обычно содержат данные о цвете RGB (хранящиеся как прямой цвет , сжатые форматы или индексированный цвет ), а иногда и дополнительный канал для альфа-смешивания ( RGBA ), особенно для рекламных щитов и текстур наложения декалей . Можно использовать альфа-канал (который может быть удобно хранить в форматах, анализируемых оборудованием) для других целей, таких как зеркальность .
Несколько текстурных карт (или каналов ) можно объединять для управления зеркальностью , нормалями , смещением или подповерхностным рассеиванием , например, для рендеринга кожи.
Несколько текстурных изображений могут быть объединены в текстурные атласы или массивы текстур для уменьшения изменений состояния для современного оборудования. (Их можно считать современной эволюцией графики тайловых карт ). Современное оборудование часто поддерживает текстуры кубических карт с несколькими гранями для отображения среды.
Текстурные карты могут быть получены путем сканирования / цифровой фотографии , разработаны в программном обеспечении для обработки изображений , таком как GIMP , Photoshop , или нарисованы на 3D-поверхностях непосредственно в инструменте для 3D-рисования, таком как Mudbox или ZBrush .
Этот процесс похож на наложение узорчатой бумаги на обычную белую коробку. Каждой вершине в полигоне назначается текстурная координата (которая в 2D-случае также известна как UV-координаты ). Это может быть сделано посредством явного назначения атрибутов вершин , вручную отредактированных в пакете 3D-моделирования с помощью инструментов UV-развертки . Также возможно связать процедурное преобразование из 3D-пространства в текстурное пространство с материалом . Это может быть достигнуто посредством плоской проекции или, альтернативно, цилиндрического или сферического отображения. Более сложные отображения могут учитывать расстояние вдоль поверхности, чтобы минимизировать искажения. Эти координаты интерполируются по граням полигонов для выборки текстурной карты во время рендеринга. Текстуры могут быть повторены или зеркально отображены , чтобы расширить конечную прямоугольную битовую карту на большую площадь, или они могут иметь уникальное « инъективное » отображение один к одному из каждой части поверхности (что важно для отображения рендеринга и отображения освещения , также известного как запекание ).
Текстурное отображение отображает поверхность модели (или экранное пространство во время растеризации) в текстурное пространство ; в этом пространстве текстурная карта видна в неискаженном виде. Инструменты UV-развертки обычно предоставляют вид в текстурном пространстве для ручного редактирования текстурных координат. Некоторые методы рендеринга, такие как подповерхностное рассеивание, могут быть выполнены приблизительно с помощью операций в текстурном пространстве.
Мультитекстурирование — это использование более одной текстуры одновременно на полигоне. Например, текстура карты освещения может использоваться для освещения поверхности в качестве альтернативы пересчету этого освещения каждый раз при рендеринге поверхности. Микротекстуры или текстуры деталей используются для добавления более высокочастотных деталей, а карты грязи могут добавлять выветривание и вариации; это может значительно уменьшить кажущуюся периодичность повторяющихся текстур. Современная графика может использовать более 10 слоев, которые объединяются с помощью шейдеров , для большей точности. Другой метод мультитекстурирования — это рельефное отображение , которое позволяет текстуре напрямую контролировать направление поверхности для целей ее расчетов освещения; оно может дать очень хороший вид сложной поверхности (например, коры дерева или грубого бетона), которая приобретает детали освещения в дополнение к обычной детальной окраске. Рельефное отображение стало популярным в последних видеоиграх, поскольку графическое оборудование стало достаточно мощным, чтобы вместить его в режиме реального времени.
Способ, которым сэмплы (например, при просмотре в виде пикселей на экране) вычисляются из текселей (пикселей текстуры), регулируется фильтрацией текстур . Самый дешевый метод — использовать интерполяцию ближайшего соседа , но билинейная интерполяция или трилинейная интерполяция между MIP-картами — это две часто используемые альтернативы, которые уменьшают алиасинг или неровности . В случае, если координата текстуры находится за пределами текстуры, она либо зажимается , либо оборачивается . Анизотропная фильтрация лучше устраняет направленные артефакты при просмотре текстур с косых углов обзора.
Потоковая передача текстур — это способ использования потоков данных для текстур, где каждая текстура доступна в двух или более различных разрешениях, чтобы определить, какую текстуру следует загрузить в память и использовать на основе расстояния от зрителя и объема памяти, доступной для текстур. Потоковая передача текстур позволяет движку рендеринга использовать текстуры низкого разрешения для объектов, находящихся далеко от камеры зрителя, и преобразовывать их в более подробные текстуры, считываемые из источника данных, по мере приближения точки обзора к объектам.
В качестве оптимизации можно визуализировать детали из сложной модели с высоким разрешением или дорогостоящего процесса (например, глобального освещения ) в текстуру поверхности (возможно, на модели с низким разрешением). Об этом говорит сайт https://intellect.icu . Запекание также известно как отображение рендеринга . Этот метод чаще всего используется для карт освещения , но может также использоваться для генерации карт нормалей и карт смещения . Некоторые компьютерные игры (например, Messiah ) использовали этот метод. Оригинальный программный движок Quake использовал запекание на лету для объединения карт освещения и цветовых карт (« кэширование поверхности »).
Запекание может использоваться как форма генерации уровня детализации , где сложная сцена со множеством различных элементов и материалов может быть аппроксимирована одним элементом с одной текстурой, которая затем алгоритмически уменьшается для снижения стоимости рендеринга и меньшего количества вызовов отрисовки . Он также используется для взятия высокодетализированных моделей из программного обеспечения для 3D-скульптуры и сканирования облака точек и аппроксимации их сетками , более подходящими для рендеринга в реальном времени.
Пример использования Normal map для уменьшения количества полигонов модели без потери качества визуального отображения.
Карты нормалей обычно бывают двух типов: object-space — используется для не деформируемых объектов, таких как стены, двери, оружие и т.п.; tangent-space – применяется для возможности деформировать объекты, например персонажей. Для сотворения карт нормалей традиционно употребляются высокополигональные и низкополигональные модели, по их сопоставлению устанавливающие подходящее значение отличия нормалей.
Различные методы развивались в программных и аппаратных реализациях. Каждый из них предлагает различные компромиссы в точности, универсальности и производительности.
Поскольку аффинное текстурирование не учитывает информацию о глубине вершин полигона, когда полигон не перпендикулярен наблюдателю, оно создает заметный дефект, особенно при растеризации в виде треугольников.
Аффинное текстурное отображение линейно интерполирует координаты текстуры по поверхности, и поэтому является самой быстрой формой текстурного отображения. Некоторое программное и аппаратное обеспечение (например, оригинальная PlayStation ) проецирует вершины в трехмерном пространстве на экран во время рендеринга и линейно интерполирует координаты текстуры в экранном пространстве между ними. Это может быть сделано путем увеличения фиксированных точек UV-координат или с помощью алгоритма инкрементной ошибки, похожего на алгоритм линии Брезенхэма .
В отличие от перпендикулярных полигонов, это приводит к заметным искажениям при перспективных преобразованиях (см. рисунок: текстура флажка выглядит изогнутой), особенно в качестве примитивов вблизи камеры . Такие искажения можно уменьшить, разделив полигон на более мелкие.
В случае прямоугольных объектов использование квадратурных примитивов может выглядеть менее некорректно, чем тот же прямоугольник, разделенный на треугольники, но поскольку интерполяция 4 точек усложняет растеризацию, большинство ранних реализаций предпочитали только треугольники. Некоторое оборудование, например, прямое текстурное отображение, используемое Nvidia NV1 , могло предложить эффективные квадратурные примитивы. С коррекцией перспективы (см. ниже) треугольники становятся эквивалентными, и это преимущество исчезает.
Для прямоугольных объектов, особенно перпендикулярных виду, линейная интерполяция по квадрату может дать превосходный аффинный результат по сравнению с тем же прямоугольником, разделенным на два аффинных треугольника.
Для прямоугольных объектов, которые находятся под прямым углом к зрителю, например, полы и стены, перспективу нужно корректировать только в одном направлении по экрану, а не в обоих. Правильное отображение перспективы можно рассчитать по левому и правому краям пола, а затем аффинная линейная интерполяция по этому горизонтальному промежутку будет выглядеть правильно, поскольку каждый пиксель вдоль этой линии находится на одинаковом расстоянии от зрителя.
Текстурирование с правильной перспективой учитывает положение вершин в трехмерном пространстве, а не просто интерполирует координаты в двухмерном пространстве экрана. Это позволяет добиться правильного визуального эффекта, но требует больших затрат на вычисления.
Выполнить перспективную коррекцию координат текстуры , являясь компонентом глубины с точки зрения зрителя, мы можем воспользоваться тем фактом, что значения , , и линейны в пространстве экрана по всей текстурируемой поверхности. В отличие от оригинала , и , до деления, не являются линейными по поверхности в экранном пространстве. Поэтому мы можем линейно интерполировать эти обратные величины по поверхности, вычисляя скорректированные значения в каждом пикселе, чтобы получить перспективно правильное отображение текстуры.
Для этого мы сначала вычисляем обратные величины в каждой вершине нашей геометрии (3 точки для треугольника). Для вершины у нас есть . Затем мы линейно интерполируем эти обратные величины междунвершины (например, с использованием барицентрических координат ), что приводит к интерполированным значениям по всей поверхности. В заданной точке это дает интерполированноетыя, , из . Обратите внимание, что это пока не может быть использована в качестве координат текстуры, поскольку наше деление назизменили свою систему координат.
Чтобы исправить обратно кты,впространство мы сначала вычисляем исправленныйзснова принимая обратный . Затем мы используем это, чтобы исправить наши : и .
Эта коррекция делает так, что в частях полигона, которые находятся ближе к наблюдателю, разница от пикселя к пикселю между координатами текстуры меньше (текстура растягивается шире), а в частях, которые находятся дальше, эта разница больше (текстура сжимается).
Аффинное текстурное отображение напрямую интерполирует координаты текстуры между двумя конечными точками и :
где
Перспективно-корректное отображение интерполируется после деления на глубину , затем использует свою интерполированную обратную величину для восстановления правильной координаты:
Аппаратное обеспечение для 3D-графики обычно поддерживает текстурирование с корректной перспективой.
Разработаны различные методы рендеринга текстурированной геометрии в изображения с различными компромиссами между качеством и точностью, которые можно применять как к программному обеспечению, так и к оборудованию.
Классические программные текстурные картографы обычно выполняли только простое наложение максимум с одним эффектом освещения (обычно применяемым через таблицу соответствия ), а корректность перспективы обходилась примерно в 16 раз дороже.
Движок Doom не допускал наклонных полов или наклонных стен. Это требует коррекции перспективы только один раз на каждый горизонтальный или вертикальный промежуток, а не попиксельно.
Движок Doom ограничивал мир вертикальными стенами и горизонтальными полами/потолками, с камерой, которая могла вращаться только вокруг вертикальной оси. Это означало, что стены будут иметь постоянную координату глубины вдоль вертикальной линии, а полы/потолки будут иметь постоянную глубину вдоль горизонтальной линии. После выполнения одного расчета коррекции перспективы для глубины остальная часть линии могла использовать быстрое аффинное отображение. Некоторые более поздние рендереры этой эпохи имитировали небольшое количество наклона камеры со сдвигом , что позволяло создавать видимость большей свободы при использовании той же техники рендеринга.
Некоторые движки способны визуализировать карты высот с текстурным наложением (например, Voxel Space от Nova Logic и движок для Outcast ) с помощью инкрементных алгоритмов, подобных алгоритму Брезенхэма , создавая видимость текстурированного ландшафта без использования традиционных геометрических примитивов.
Каждый треугольник может быть далее подразделен на группы примерно по 16 пикселей для достижения двух целей. Во-первых, поддержание арифметической мельницы в рабочем состоянии все время. Во-вторых, получение более быстрых арифметических результатов.
Для перспективного текстурного отображения без аппаратной поддержки треугольник разбивается на более мелкие треугольники для рендеринга, и на них применяется аффинное отображение. Причина, по которой этот метод работает, заключается в том, что искажение аффинного отображения становится гораздо менее заметным на меньших полигонах. Sony PlayStation широко использовала это, поскольку поддерживала только аффинное отображение на аппаратном уровне, но имела относительно высокую пропускную способность треугольников по сравнению с аналогами.
Методы разделения экранного пространства.
Программные рендереры обычно предпочитают разделение экрана, поскольку оно имеет меньшие накладные расходы. Кроме того, они пытаются сделать линейную интерполяцию вдоль линии пикселей, чтобы упростить настройку (по сравнению с 2D аффинной интерполяцией) и, таким образом, снова накладные расходы (также аффинное текстурирование не вписывается в небольшое количество регистров процессора x86 ; 68000 или любой RISC подходит гораздо больше).
Для Quake был использован другой подход , который вычислял бы координаты с правильной перспективой только один раз каждые 16 пикселей строки сканирования и выполнял бы линейную интерполяцию между ними, эффективно работая со скоростью линейной интерполяции, поскольку расчет с правильной перспективой выполняется параллельно на сопроцессоре. Полигоны визуализируются независимо, поэтому можно переключаться между интервалами и столбцами или диагональными направлениями в зависимости от ориентации нормали полигона, чтобы добиться более постоянного z, но усилия, похоже, того не стоят.
Другой метод заключался в аппроксимации перспективы более быстрым вычислением, таким как полином. Еще один метод использовал значение 1/z последних двух нарисованных пикселей для линейной экстраполяции следующего значения. Затем деление выполнялось, начиная с этих значений, так что делился только небольшой остаток но объем бухгалтерских операций делает этот метод слишком медленным на большинстве систем.
Наконец, движок Build расширил трюк с постоянным расстоянием, используемый в Doom, найдя линию постоянного расстояния для произвольных полигонов и выполнив рендеринг вдоль нее.
Аппаратное обеспечение для текстурного картирования изначально было разработано для моделирования (например, как реализовано в Evans and Sutherland ESIG и Singer-Link Digital Image Generators DIG), а также для профессиональных графических рабочих станций , таких как Silicon Graphics , машин для создания цифровых видеоэффектов, таких как Ampex ADO , а затем появилось в игровых автоматах , игровых консолях для потребителей и видеокартах для ПК в середине 1990-х годов. В моделировании полета текстурное картирование обеспечивало важные сигналы движения и высоты, необходимые для обучения пилотов, недоступные на нетекстурированных поверхностях. Также в приложениях для моделирования полета текстурное картирование было реализовано для обработки в реальном времени с предварительно отфильтрованными шаблонами текстур, хранящимися в памяти для доступа в реальном времени видеопроцессором.
Современные графические процессоры (GPU) предоставляют специализированные блоки с фиксированными функциями , называемые сэмплерами текстур или блоками отображения текстур , для выполнения отображения текстур, обычно с трилинейной фильтрацией или лучшей многоточечной анизотропной фильтрацией , и аппаратное обеспечение для декодирования определенных форматов, таких как DXTn . По состоянию на 2016 год аппаратное обеспечение для отображения текстур стало повсеместным, поскольку большинство SOC содержат подходящий графический процессор.
Некоторые аппаратные средства объединяют текстурное отображение с определением скрытой поверхности в отложенном рендеринге на основе плиток или рендеринге сканлайнов ; такие системы извлекают только видимые текселы за счет использования большего рабочего пространства для преобразованных вершин. Большинство систем остановились на подходе Z-буферизации , который все еще может снизить рабочую нагрузку по текстурному отображению с сортировкой спереди назад .
Среди более ранних графических устройств существовало две конкурирующие парадигмы вывода текстуры на экран:
Обратное наложение текстур — метод, который стал стандартом в современном оборудовании.
При использовании этого метода пиксель на экране сопоставляется с точкой на текстуре. Каждая вершина примитива рендеринга проецируется в точку на экране, и каждая из этих точек сопоставляется с координатой текселя au,v на текстуре. Растеризатор будет интерполировать между этими точками, чтобы заполнить каждый пиксель, покрытый примитивом.
Основное преимущество заключается в том, что каждый пиксель, покрытый примитивом, будет пройден ровно один раз. После преобразования вершин примитива объем оставшейся работы напрямую зависит от того, сколько пикселей он покрывает на экране.
Главным недостатком по сравнению с прямым отображением текстур является то, что шаблон доступа к памяти в пространстве текстур не будет линейным, если текстура находится под углом к экрану. Этот недостаток часто устраняется методами кэширования текстур , такими как расположение памяти текстур swizzled .
Линейную интерполяцию можно использовать напрямую для простого и эффективного аффинного текстурирования, но ее также можно адаптировать для обеспечения корректности перспективы .
Прямое текстурное отображение отображает каждый тексель текстуры в пиксель на экране. После преобразования прямоугольного примитива в место на экране рендерер прямого текстурного отображения проходит по каждому текселю текстуры, накладывая каждый из них на пиксель буфера кадра .
Это использовалось в некоторых аппаратных средствах, таких как 3DO , Sega Saturn и NV1 .
Основное преимущество заключается в том, что доступ к текстуре будет осуществляться в простом линейном порядке, что позволяет очень эффективно кэшировать данные текстуры. Однако это преимущество является и ее недостатком: по мере того, как примитив становится меньше на экране, ему все равно приходится проходить по каждому текселю в текстуре, что приводит к избыточной перерисовке многих пикселей.
Этот метод также хорошо подходит для рендеринга примитивов квадратов, а не для их сведения к треугольникам, что давало преимущество, когда корректное текстурирование перспективы не было доступно на аппаратном уровне. Это связано с тем, что аффинное искажение квадрата выглядит менее неправильным, чем тот же квадрат, разделенный на два треугольника (см. аффинное отображение текстуры выше). Аппаратное обеспечение NV1 также позволяло использовать режим квадратичной интерполяции для обеспечения еще лучшего приближения корректности перспективы.
Существующие аппаратные реализации не обеспечивали эффективного отображения координат UV , что стало важной техникой для 3D-моделирования и помогло правильно обрезать текстуру, когда примитив выходит за край экрана. Эти недостатки можно было бы устранить с помощью дальнейшего развития, но с тех пор дизайн GPU в основном перешел к обратному отображению.
Помимо 3D-рендеринга, доступность аппаратного обеспечения для наложения текстур вдохновила на его использование для ускорения других задач:
Можно использовать оборудование для текстурного картирования для ускорения как реконструкции наборов воксельных данных из томографических сканов , так и для визуализации результатов .
Многие пользовательские интерфейсы используют наложение текстур для ускорения анимированных переходов элементов экрана, например Exposé в Mac OS X.
Исследование, описанное в статье про наложение текстур, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое наложение текстур и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Компьютерная графика
Комментарии
Оставить комментарий
Компьютерная графика
Термины: Компьютерная графика