Текстурное отображение [1] [2] [3] — это метод отображения текстуры на компьютерной графике . «Текстура» в этом контексте может быть высокочастотной детализацией , текстурой поверхности или цветом .
Первоначальная методика была впервые предложена Эдвином Кэтмеллом в 1974 году в рамках его докторской диссертации. [4]
Текстурное отображение изначально относилось к диффузному отображению , методу, который просто отображал пиксели из текстуры на 3D-поверхность («оборачивая» изображение вокруг объекта). В последние десятилетия появление многопроходного рендеринга, мультитекстурирования , MIP-карт и более сложных отображений, таких как отображение высот , отображение рельефа , отображение нормалей , отображение смещения , отображение отражения , отображение зеркального отражения , отображение окклюзии и многих других вариаций техники (управляемых системой материалов ) сделали возможным моделирование почти фотореализма в реальном времени за счет значительного сокращения количества полигонов и расчетов освещения, необходимых для построения реалистичной и функциональной 3D-сцены.
АКарта текстуры [5][6]— это изображение, нанесенное (отображенное) на поверхность формы илимногоугольника.[7]Это может бытьрастровое изображениеилипроцедурная текстура. Они могут храниться в общихформатах файлов изображений, ссылаться наформаты 3D-моделейилиопределения материалови собираться впакеты ресурсов.
Они могут иметь от одного до трех измерений, хотя для видимых поверхностей чаще всего используются два измерения. Для использования с современным оборудованием данные текстурных карт могут храниться в свизлированных или плиточных порядках для улучшения согласованности кэша . API рендеринга обычно управляют ресурсами текстурных карт (которые могут находиться в памяти устройства ) как буферами или поверхностями и могут разрешать « рендеринг в текстуру » для дополнительных эффектов, таких как постобработка или отображение среды .
Они обычно содержат данные о цвете RGB (хранящиеся как прямой цвет , сжатые форматы или индексированный цвет ), а иногда и дополнительный канал для альфа-смешивания ( RGBA ), особенно для рекламных щитов и текстур наложения декалей . Можно использовать альфа-канал (который может быть удобно хранить в форматах, анализируемых оборудованием) для других целей, таких как зеркальность .
Несколько текстурных карт (или каналов ) можно объединять для управления зеркальностью , нормалями , смещением или подповерхностным рассеиванием , например, для рендеринга кожи.
Несколько текстурных изображений могут быть объединены в текстурные атласы или массивы текстур для уменьшения изменений состояния для современного оборудования. (Их можно считать современной эволюцией графики тайловых карт ). Современное оборудование часто поддерживает текстуры кубических карт с несколькими гранями для отображения среды.
Текстурные карты могут быть получены путем сканирования / цифровой фотографии , разработаны в программном обеспечении для обработки изображений , таком как GIMP , Photoshop , или нарисованы на 3D-поверхностях непосредственно в инструменте для 3D-рисования, таком как Mudbox или ZBrush .
Этот процесс похож на наложение узорчатой бумаги на обычную белую коробку. Каждой вершине в полигоне назначается текстурная координата (которая в 2D-случае также известна как UV-координаты ). [8] Это может быть сделано посредством явного назначения атрибутов вершин , вручную отредактированных в пакете 3D-моделирования с помощью инструментов UV-развертки . Также возможно связать процедурное преобразование из 3D-пространства в текстурное пространство с материалом. Это может быть достигнуто посредством плоской проекции или, альтернативно, цилиндрического или сферического отображения. Более сложные отображения могут учитывать расстояние вдоль поверхности, чтобы минимизировать искажения. Эти координаты интерполируются по граням полигонов для выборки текстурной карты во время рендеринга. Текстуры могут быть повторены или зеркально отображены , чтобы расширить конечную прямоугольную битовую карту на большую площадь, или они могут иметь уникальное « инъективное » отображение один к одному из каждой части поверхности (что важно для отображения рендеринга и отображения освещения , также известного как запекание ).
Текстурное отображение отображает поверхность модели (или экранное пространство во время растеризации) в текстурное пространство ; в этом пространстве текстурная карта видна в неискаженном виде. Инструменты UV-развертки обычно предоставляют вид в текстурном пространстве для ручного редактирования текстурных координат. Некоторые методы рендеринга, такие как подповерхностное рассеивание, могут быть выполнены приблизительно с помощью операций в текстурном пространстве.
Мультитекстурирование — это использование более одной текстуры одновременно на полигоне. [9] Например, текстура карты освещения может использоваться для освещения поверхности в качестве альтернативы пересчету этого освещения каждый раз при рендеринге поверхности. Микротекстуры или текстуры деталей используются для добавления более высокочастотных деталей, а карты грязи могут добавлять выветривание и вариации; это может значительно уменьшить кажущуюся периодичность повторяющихся текстур. Современная графика может использовать более 10 слоев, которые объединяются с помощью шейдеров , для большей точности. Другой метод мультитекстурирования — это рельефное отображение , которое позволяет текстуре напрямую контролировать направление поверхности для целей ее расчетов освещения; оно может дать очень хороший вид сложной поверхности (например, коры дерева или грубого бетона), которая принимает детали освещения в дополнение к обычной детальной окраске. Рельефное отображение стало популярным в последних видеоиграх, поскольку графическое оборудование стало достаточно мощным, чтобы вместить его в режиме реального времени. [10]
Способ, которым сэмплы (например, при просмотре в виде пикселей на экране) вычисляются из текселей (пикселей текстуры), регулируется фильтрацией текстур . Самый дешевый метод — использовать интерполяцию ближайшего соседа , но билинейная интерполяция или трилинейная интерполяция между MIP-картами — это две часто используемые альтернативы, которые уменьшают алиасинг или неровности . В случае, если координата текстуры находится за пределами текстуры, она либо зажимается , либо оборачивается . Анизотропная фильтрация лучше устраняет направленные артефакты при просмотре текстур с косых углов обзора.
Потоковая передача текстур — это способ использования потоков данных для текстур, где каждая текстура доступна в двух или более различных разрешениях, чтобы определить, какую текстуру следует загрузить в память и использовать на основе расстояния от зрителя и объема памяти, доступной для текстур. Потоковая передача текстур позволяет движку рендеринга использовать текстуры низкого разрешения для объектов, находящихся далеко от камеры зрителя, и преобразовывать их в более подробные текстуры, считываемые из источника данных, по мере приближения точки обзора к объектам.
В качестве оптимизации можно визуализировать детали из сложной модели с высоким разрешением или дорогостоящего процесса (например, глобального освещения ) в текстуру поверхности (возможно, на модели с низким разрешением). Запекание также известно как отображение рендеринга . Этот метод чаще всего используется для карт освещения , но может также использоваться для генерации карт нормалей и карт смещения . Некоторые компьютерные игры (например, Messiah ) использовали этот метод. Оригинальный программный движок Quake использовал запекание на лету для объединения карт освещения и цветовых карт (« кэширование поверхности »).
Запекание может использоваться как форма генерации уровня детализации , где сложная сцена со множеством различных элементов и материалов может быть аппроксимирована одним элементом с одной текстурой, которая затем алгоритмически уменьшается для снижения стоимости рендеринга и меньшего количества вызовов отрисовки . Он также используется для взятия высокодетализированных моделей из программного обеспечения для 3D-скульптуры и сканирования облака точек и аппроксимации их сетками , более подходящими для рендеринга в реальном времени.
Различные методы развивались в программных и аппаратных реализациях. Каждый из них предлагает различные компромиссы в точности, универсальности и производительности.
Аффинное текстурное отображение линейно интерполирует координаты текстуры по поверхности, и поэтому является самой быстрой формой текстурного отображения. Некоторое программное и аппаратное обеспечение (например, оригинальная PlayStation ) проецирует вершины в трехмерном пространстве на экран во время рендеринга и линейно интерполирует координаты текстуры в экранном пространстве между ними. Это может быть сделано путем увеличения фиксированных точек UV-координат или с помощью алгоритма инкрементной ошибки, похожего на алгоритм линии Брезенхэма .
В отличие от перпендикулярных полигонов, это приводит к заметным искажениям при перспективных преобразованиях (см. рисунок: текстура флажка выглядит изогнутой), особенно в качестве примитивов вблизи камеры . Такие искажения можно уменьшить, разделив полигон на более мелкие.
В случае прямоугольных объектов использование квадратурных примитивов может выглядеть менее некорректно, чем тот же прямоугольник, разделенный на треугольники, но поскольку интерполяция 4 точек усложняет растеризацию, большинство ранних реализаций предпочитали только треугольники. Некоторое оборудование, например, прямое текстурное отображение, используемое Nvidia NV1 , могло предложить эффективные квадратурные примитивы. С коррекцией перспективы (см. ниже) треугольники становятся эквивалентными, и это преимущество исчезает.
Для прямоугольных объектов, которые находятся под прямым углом к зрителю, например, полы и стены, перспективу нужно корректировать только в одном направлении по экрану, а не в обоих. Правильное отображение перспективы можно рассчитать по левому и правому краям пола, а затем аффинная линейная интерполяция по этому горизонтальному промежутку будет выглядеть правильно, поскольку каждый пиксель вдоль этой линии находится на одинаковом расстоянии от зрителя.
Текстурирование с правильной перспективой учитывает положение вершин в трехмерном пространстве, а не просто интерполирует координаты в двухмерном пространстве экрана. [11] Это позволяет добиться правильного визуального эффекта, но требует больших затрат на вычисления. [11]
Для выполнения коррекции перспективы координат текстуры и , где является компонентом глубины с точки зрения наблюдателя, мы можем воспользоваться тем фактом, что значения , , и линейны в экранном пространстве по текстурируемой поверхности. Напротив, исходные , и , до деления, не являются линейными по поверхности в экранном пространстве. Поэтому мы можем линейно интерполировать эти обратные величины по поверхности, вычисляя скорректированные значения в каждом пикселе, чтобы получить корректное с точки зрения перспективы отображение текстуры.
Для этого мы сначала вычисляем обратные величины в каждой вершине нашей геометрии (3 точки для треугольника). Для вершины у нас есть . Затем мы линейно интерполируем эти обратные величины между вершинами (например, используя барицентрические координаты ), что приводит к интерполированным значениям по всей поверхности. В заданной точке это дает интерполированные , и . Обратите внимание, что это пока нельзя использовать в качестве наших текстурных координат, поскольку наше деление на измененную их систему координат.
Чтобы исправить обратно в пространство, мы сначала вычисляем исправленное , снова взяв обратную величину . Затем мы используем это для исправления наших : и . [12]
Эта коррекция делает так, что в частях полигона, которые находятся ближе к наблюдателю, разница от пикселя к пикселю между координатами текстуры меньше (текстура растягивается шире), а в частях, которые находятся дальше, эта разница больше (текстура сжимается).
Аппаратное обеспечение для 3D-графики обычно поддерживает текстурирование с корректной перспективой.
Разработаны различные методы рендеринга текстурированной геометрии в изображения с различными компромиссами между качеством и точностью, которые можно применять как к программному обеспечению, так и к оборудованию.
Классические программные текстурные картографы обычно выполняли только простое наложение максимум с одним эффектом освещения (обычно применяемым через таблицу соответствия ), а корректность перспективы обходилась примерно в 16 раз дороже.
Движок Doom ограничивал мир вертикальными стенами и горизонтальными полами/потолками, с камерой, которая могла вращаться только вокруг вертикальной оси. Это означало, что стены будут иметь постоянную координату глубины вдоль вертикальной линии, а полы/потолки будут иметь постоянную глубину вдоль горизонтальной линии. После выполнения одного расчета коррекции перспективы для глубины остальная часть линии могла использовать быстрое аффинное отображение. Некоторые более поздние рендереры этой эпохи имитировали небольшое количество наклона камеры со сдвигом , что позволяло создавать видимость большей свободы при использовании той же техники рендеринга.
Некоторые движки способны визуализировать карты высот с текстурным наложением (например, Voxel Space от Nova Logic и движок для Outcast ) с помощью инкрементных алгоритмов, подобных алгоритму Брезенхэма , создавая видимость текстурированного ландшафта без использования традиционных геометрических примитивов. [13]
Каждый треугольник может быть далее подразделен на группы примерно по 16 пикселей для достижения двух целей. Во-первых, поддержание арифметической мельницы в рабочем состоянии все время. Во-вторых, получение более быстрых арифметических результатов. [ неопределенно ]
Для перспективного текстурного отображения без аппаратной поддержки треугольник разбивается на более мелкие треугольники для рендеринга, и на них применяется аффинное отображение. Причина, по которой этот метод работает, заключается в том, что искажение аффинного отображения становится гораздо менее заметным на меньших полигонах. Sony PlayStation широко использовала это, поскольку поддерживала только аффинное отображение на аппаратном уровне, но имела относительно высокую пропускную способность треугольников по сравнению с аналогами.
Программные рендереры обычно предпочитают разделение экрана, поскольку оно имеет меньшие накладные расходы. Кроме того, они пытаются сделать линейную интерполяцию вдоль линии пикселей, чтобы упростить настройку (по сравнению с 2D аффинной интерполяцией) и, таким образом, снова накладные расходы (также аффинное текстурирование не вписывается в небольшое количество регистров процессора x86 ; 68000 или любой RISC подходит гораздо больше).
Для Quake был использован другой подход , который вычислял бы координаты с правильной перспективой только один раз каждые 16 пикселей строки сканирования и линейно интерполировал бы между ними, эффективно работая со скоростью линейной интерполяции, поскольку расчет с правильной перспективой выполняется параллельно на сопроцессоре. [14] Полигоны визуализируются независимо, поэтому можно переключаться между интервалами и столбцами или диагональными направлениями в зависимости от ориентации нормали полигона, чтобы достичь более постоянного z, но усилия, похоже, того не стоят.
Другой метод заключался в аппроксимации перспективы более быстрым вычислением, таким как полином. Еще один метод использовал значение 1/z последних двух нарисованных пикселей для линейной экстраполяции следующего значения. Затем деление выполнялось, начиная с этих значений, так что делился только небольшой остаток [15], но объем бухгалтерских операций делает этот метод слишком медленным на большинстве систем.
Наконец, движок Build расширил трюк с постоянным расстоянием, используемый в Doom, найдя линию постоянного расстояния для произвольных полигонов и выполнив рендеринг вдоль нее.
Аппаратное обеспечение для текстурного картирования изначально было разработано для моделирования (например, как реализовано в Evans and Sutherland ESIG и Singer-Link Digital Image Generators DIG), а также для профессиональных графических рабочих станций , таких как Silicon Graphics , машин для создания цифровых видеоэффектов, таких как Ampex ADO , а затем появилось в игровых автоматах , игровых консолях для потребителей и видеокартах для ПК в середине 1990-х годов. В моделировании полета текстурное картирование обеспечивало важные сигналы движения и высоты, необходимые для обучения пилотов, недоступные на нетекстурированных поверхностях. Также в приложениях для моделирования полета текстурное картирование было реализовано для обработки в реальном времени с предварительно отфильтрованными шаблонами текстур, хранящимися в памяти для доступа в реальном времени видеопроцессором. [16]
Современные графические процессоры (GPU) предоставляют специализированные блоки с фиксированными функциями , называемые сэмплерами текстур или блоками отображения текстур , для выполнения отображения текстур, обычно с трилинейной фильтрацией или лучшей многоточечной анизотропной фильтрацией , и аппаратное обеспечение для декодирования определенных форматов, таких как DXTn . По состоянию на 2016 год аппаратное обеспечение для отображения текстур стало повсеместным, поскольку большинство SOC содержат подходящий графический процессор.
Некоторые аппаратные средства объединяют текстурное отображение с определением скрытой поверхности в отложенном рендеринге на основе плиток или рендеринге сканлайнов ; такие системы извлекают только видимые текселы за счет использования большего рабочего пространства для преобразованных вершин. Большинство систем остановились на подходе Z-буферизации , который все еще может снизить рабочую нагрузку по текстурному отображению с сортировкой спереди назад .
Среди более ранних графических устройств существовало две конкурирующие парадигмы вывода текстуры на экран:
Обратное наложение текстур — метод, который стал стандартом в современном оборудовании.
При использовании этого метода пиксель на экране сопоставляется с точкой на текстуре. Каждая вершина примитива рендеринга проецируется в точку на экране, и каждая из этих точек сопоставляется с координатой текселя au,v на текстуре. Растеризатор будет интерполировать между этими точками, чтобы заполнить каждый пиксель, покрытый примитивом.
Основное преимущество заключается в том, что каждый пиксель, покрытый примитивом, будет пройден ровно один раз. После преобразования вершин примитива объем оставшейся работы напрямую зависит от того, сколько пикселей он покрывает на экране.
Главным недостатком по сравнению с прямым отображением текстур является то, что шаблон доступа к памяти в пространстве текстур не будет линейным, если текстура находится под углом к экрану. Этот недостаток часто устраняется методами кэширования текстур , такими как расположение памяти текстур swizzled .
Линейную интерполяцию можно использовать напрямую для простого и эффективного аффинного текстурирования, но ее также можно адаптировать для обеспечения корректности перспективы.
Прямое текстурное отображение отображает каждый тексель текстуры в пиксель на экране. После преобразования прямоугольного примитива в место на экране рендерер прямого текстурного отображения проходит по каждому текселю текстуры, накладывая каждый из них на пиксель буфера кадра .
Это использовалось в некоторых аппаратных средствах, таких как 3DO , Sega Saturn и NV1 .
Основное преимущество заключается в том, что доступ к текстуре будет осуществляться в простом линейном порядке, что позволяет очень эффективно кэшировать данные текстуры. Однако это преимущество является и ее недостатком: по мере того, как примитив становится меньше на экране, ему все равно приходится проходить по каждому текселю в текстуре, что приводит к избыточной перерисовке многих пикселей.
Этот метод также хорошо подходит для рендеринга примитивов квадратов, а не для их сведения к треугольникам, что давало преимущество, когда корректное текстурирование перспективы не было доступно на аппаратном уровне. Это связано с тем, что аффинное искажение квадрата выглядит менее неправильным, чем тот же квадрат, разделенный на два треугольника (см. аффинное отображение текстуры выше). Аппаратное обеспечение NV1 также позволяло использовать режим квадратичной интерполяции для обеспечения еще лучшего приближения корректности перспективы.
Существующие аппаратные реализации не обеспечивали эффективного отображения координат UV , что стало важной техникой для 3D-моделирования и помогло правильно обрезать текстуру, когда примитив выходит за край экрана. Эти недостатки можно было бы устранить с помощью дальнейшего развития, но с тех пор дизайн GPU в основном перешел к обратному отображению.
Помимо 3D-рендеринга, доступность аппаратного обеспечения для наложения текстур вдохновила на его использование для ускорения других задач:
Можно использовать оборудование для текстурного картирования для ускорения как реконструкции наборов воксельных данных из томографических сканов , так и для визуализации результатов . [17]
Многие пользовательские интерфейсы используют наложение текстур для ускорения анимированных переходов элементов экрана, например Exposé в Mac OS X.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка ){{cite journal}}
: Внешняя ссылка в |ref=
( помощь )