Рендеринг в реальном времени



Мы поможем в написании ваших работ!


Мы поможем в написании ваших работ!



Мы поможем в написании ваших работ!


ЗНАЕТЕ ЛИ ВЫ?

Рендеринг в реальном времени



Шейдерный язык OpenGL носит название GLSL (The OpenGL Shading Language). GLSL основан на языке ANSI C. Большинство возможностей языка ANSI C сохранено, к ним добавлены векторные и матричные типы данных, часто применяющиеся при работе с трехмерной графикой. В контексте GLSL шейдером называется независимо компилируемая единица, написанная на этом языке. Программой называется набор откомпилированных шейдеров, связанных вместе.

Шейдерный язык Cg

Разработан nVidia совместно с Microsoft (такой же по сути язык от Microsoft называется HLSL, включён в DirectX 9). Cg расшифровывается как C for Graphics. Язык действительно очень похож на C, он использует схожие типы (int, float, а также специальный 16-битный тип с плавающей запятой — half). Поддерживаются функции и структуры. Язык обладает своеобразными оптимизациями в виде упакованных массивов (packed arrays) — объявления типа «float a[4]» и «float4 a» в нём соответствуют разным типам. Второе объявление и есть упакованный массив, операции с упакованным массивом выполняются быстрее, чем с обычными. Несмотря на то, что язык разработан nVidia, он без проблем работает и с видеокартами ATI. Однако следует учесть, что все шейдерные программы обладают своими особенностями, о которых можно узнать из специализированных источников.

Шейдерные языки DirectX

Низкоуровневый шейдерный язык DirectX (DirectX ASM)

По синтаксису сходен с Ассемблером. Существует несколько версий, различающихся по набору команд, а также по требуемому оборудованию. Существует разделение на вершинные (vertex) и пиксельные (pixel) шейдеры, которые различаются.

· Вершинный шейдер

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

vs.2.0dcl_position v0dcl_texcoord v3m4x4 oPos, v0, c0mov oT0, v3

· Пиксельный шейдер

Выполняет обработку цветовых данных, полученных при рисовании треугольника. Оперирует с текстурами и цветом. Количество инструкций значительно ограничено. Так, к примеру, в версии 1.4 оно не может быть больше 32-х. Пример фрагмента кода:

ps.1.4texld r0, t0mul r0, r0, v0

Высокоуровневый шейдерный язык DirectX (HLSL — High Level Shader Language)

Является надстройкой над DirectX ASM. По синтаксису сходен с C, позволяет использовать структуры, процедуры и функции.

 

Типы шейдеров

В настоящее время шейдеры делятся на три типа: вершинные, геометрические и фрагментные (пиксельные).
Вершинные шейдеры (Vertex Shader)
Вершинный шейдер оперирует данными, сопоставленными с вершинами многогранников. К таким данным, в частности, относятся координаты вершины в пространстве, текстурные координаты, тангенс-вектор, вектор бинормали, вектор нормали. Вершинный шейдер может быть использован для видового и перспективного преобразования вершин, генерации текстурных координат, расчета освещения и т. д.
Геометрические шейдеры (Geometry Shader)
Геометрический шейдер, в отличие от вершинного, способен обработать не только одну вершину, но и целый примитив. Это может быть отрезок (две вершины) и треугольник (три вершины), а при наличии информации о смежных вершинах (adjacency) может быть обработано до шести вершин для треугольного примитива. Кроме того, геометрический шейдер способен генерировать примитивы «на лету», не задействуя при этом центральный процессор. Впервые начал использоваться на видеокартах Nvidia серии 8.
Пиксельные шейдеры (Pixel Shader)
Фрагментный шейдер работает с фрагментами изображения. Под фрагментом изображения в данном случае понимается пиксель, которому поставлен в соответствие некоторый набор атрибутов, таких как цвет, глубина, текстурные координаты. Фрагментный шейдер используется на последней стадии графического конвейера для формирования фрагмента изображения.

 

57. Определение, основные понятия и методы текстурирования

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

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

Традиционно термином texture mapping или тектурирование в трехмерном моделировании называют процесс наложения двухмерной текстуры на трехмерный объект (текстура как бы натягивается на объект) для придания ему соответствующего внешнего вида. Таким образом, например, производится "раскрашивание" моделей монстров и игроков в трехмерных играх типа Quake и др.

Методы текстурирования

Bump mapping(рельефное текстурирование) - простой способ создания эффекта рельефной поверхности с детализацией большей, чем позволяет полигональная поверхность. Эффект главным образом достигается за счет освещения поверхности источником света и черно-белой (одноканальной) карты высот, путем виртуального смещения пикселя (как при методе Displace mapping) как если бы там был вертекс(только без физического и визуального сдвига), за счет чего таким же образом изменяется ориентация нормалей использующихся для расчета освещенности пикселя (затенение по Фонгу), в результате получаются по-разному освещенные и затененные участки. Как правило Bump mapping позволяет создать не очень сложные бугристые поверхности, плоские выступы или впадины, на этом его использование заканчивается. Для более детальных эффектов в последствии был придуман Normal mapping.

MIP-текстурирование (англ. MIP mapping) — метод текстурирования, использующий несколько копий одной текстуры с разной детализацией. Название происходит от лат. multum in parvo — «много в малом».

Изображение лучше всего выглядит, когда детализация текстуры близка к разрешению экрана. Если разрешение экрана высокое (текстура слишком маленькая/объект очень близко), получается размытое изображение. Если же разрешение текстуры слишком высокое (текстура слишком велика/объект очень далеко), получаем случайные пиксели — а значит, потерю мелких деталей, мерцание и большой проценткэш-промахов. Получается, что лучше иметь несколько текстур разной детализации и накладывать на объект ту, которая наиболее подходит в данной ситуации.

Принцип действия

Создаётся так называемая MIP-пирамида — последовательность текстур с разрешением от максимального до 1×1. Например: 1×1, 2×2, 4×4, 8×8, 16×16, 32×32, 64×64, 128×128, 256×256, 512×512 и 1024×1024. Каждая из этих текстур называется MIP-уровнем (англ. MIP level) или уровнем детализации - LOD (англ. level of detail).

На всех этих текстурах находится одно и то же изображение. Таким образом, MIP-текстурирование увеличивает расход видеопамяти на треть:

.

При наложении текстур вычисляется расстояние до объекта и номер текстуры находится по формуле:

,

где resolution — разрешение виртуальной камеры (количество пикселей, которое будет в объекте размером в 1 ед., расположенном в 1 ед. от камеры), texelsize — размер текселя в единицах трёхмерного мира, dist — расстояние до объекта в тех же единицах, mip bias — число, позволяющее выбирать более или менее детальную текстуру, чем даёт формула.

Эта цифра округляется до целого, и текстура с соответствующим номером (нулевая — самая детальная, первая — вдвое меньшая и т. д.) накладывается на объект.

Недостатки

Расход видеопамяти увеличивается на треть. Впрочем, типичные объемы видеопамяти в начале 2010ых составляют 1-3 ГБ. К тому же, если объект далеко, его детальную текстуру можно выгрузить в оперативную память.

MIP-текстурирование не решает проблему текстур, находящихся под острым углом к зрителю (например, дорога в автосимуляторе). У таких текстур разрешение по одной оси сильно отличается от разрешения по другой — и, например, по оси X изображение явно размыто, в то время как по оси Y видны мерцания, свойственные завышенному разрешению текстуры. Есть сразу несколько способов решения этого (начиная с наименее качественного):

Установить в видеодрайвере наиболее комфортное значение mip bias — числа́, которое отвечает за выбор номера текстуры в пирамиде. Если оно отрицательное, видеоплата берёт более детальные текстуры, если положительное — менее детальные.

Многие игры сами устанавливают подходящий mip bias для разных типов объектов. Например, в Live for Speed mip bias устанавливается пользователем отдельно для автомобилей, препятствий и дороги.

Воспользоваться анизотропной фильтрацией — методом текстурирования, который направлен именно на решение этой проблемы.

Наконец, видна чёткая граница между MIP-уровнями. Это решается трилинейной фильтрацией.

Процедурное текстурирование — метод создания текстур, при котором изображение текстуры создается с помощью какого-либо алгоритма (процедурного алгоритма).

Лучше всего процесс процедурного текстурирования представить в виде блоков (операторов). Существует три типа блоков:

генераторы

фильтры

вспомогательные

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

Для создания «природных» текстур, таких как дерево, гранит, металл, камни, лава в качестве фильтров используютсяфрактальный шум (англ. fractal noise) и ячеистые текстуры (англ. cellular textures).

Свойства процедурных текстур:

Обратимость. В процедурной текстуре сохраняется вся история ее создания.

Малый размер (если в качестве исходных данных к процедурным алгоритмам выступают только числовые значения).

Неограниченное количество вариаций при использовании стохастических (использующих генератор псевдослучайных чисел) алгоритмов.

Масштабируемость до любого размера (зависит от процедурного движка/библиотеки).

Одновременно с итоговой текстурой очень легко получаются alpha-, bump-, reflect-карты.

Детальное текстурирование (англ. Detail mapping) — программная техника в трёхмерной компьютерной графике, которая позволяет улучшить детализацию текстур на близком расстоянии от камеры. Конечный результат создаёт иллюзию использования текстуры огромного разрешения.

При приближении камеры к полигональной модели текстура становится размытой. В случае достаточного объема свободной памяти размытие может быть устранено увеличением разрешения текстуры. Однако хранение каждой текстуры в огромном разрешении не является практичным решением. Детальное текстурирование решает проблему другим путём:

Базовая текстура оставляется в разумном среднем разрешении

Создаётся детальная текстура с крупномасштабным изображением мелких деталей (отдельные травинки, галька, структура древесины и т. д.)

Полученная текстура обесцвечивается

Фильтром верхних частот удаляется всё, кроме самых мелких деталей

Фильтром коррекции гистограммы устанавливается средняя яркость на уровне 0.5

Обе текстуры смешиваются в пиксельном шейдере

Перед смешиванием текстурные координаты детальной текстуры масштабируются, чтобы детальная текстура повторялась в несколько раз чаще базовой

Для снижения заметности повторений детальной текстуры масштаб выбирается нецелочисленным

Цвет базовой текстуры умножается на цвет детальной, умноженный на 2 (для сохранения исходной яркости)

Рельефное текстурирование

Рельефное текстурирование — метод в компьютерной графике для придания более реалистичного и насыщенного вида поверхности объектов.

Bump mapping - простой способ создания эффекта рельефной поверхности с детализацией большей, чем позволяет полигональная поверхность. Эффект главным образом достигается за счет освещения поверхности источником света и черно-белой (одноканальной) карты высот, путем виртуального смещения пикселя (как при методе Displace mapping) как если бы там был вертекс(только без физического и визуального сдвига), за счет чего таким же образом изменяется ориентация нормалей использующихся для расчета освещенности пикселя (затенение по Фонгу), в результате получаются по-разному освещенные и затененные участки. Как правило Bump mapping позволяет создать не очень сложные бугристые поверхности, плоские выступы или впадины, на этом его использование заканчивается. Для более детальных эффектов в последствии был придуман Normal mapping.

Normal mapping - техника, позволяющая изменять нормаль отображаемого пикселя основываясь на цветной карте нормалей, в которой эти отклонения хранятся в виде текселя, цветовые составляющие которого [r,g,b] интерпретируются в оси вектора [x,y,z], на основе которого вычисляется нормаль, используемая для расчета освещенности пикселя. Благодаря тому, что в карте нормалей задействуются 3 канала текстуры, этот метод дает большую точность, чем Bump mapping, в котором используется только один канал и нормали, по сути, всего лишь интерпретируются в зависимости от "высоты".

Карты нормалей обычно бывают двух типов:

object-space - используется для не деформирующихся объектов, таких как стены, двери, оружие и т.п.

tangent-space - применяется для возможности деформировать объекты, например персонажей .

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

Parallax mapping

Данная технология также использует карты нормалей, но, в отличие от normal mapping, она реализует не только освещение с учётом рельефа, но и сдвигает координаты диффузной текстуры. Этим достигается наиболее полный эффект рельефа, особенно при взгляде на поверхность под углом.

Parallax occlusion mapping

Parallax occlusion mapping является усовершенствованной и в то же время одной из наиболее вычислительно сложных разновидностей Parallax mapping. Фактически представляет собой форму локального рейтрейсинга (трассировки лучей) в пиксельном шейдере. Трассировка лучей используется для определения высот и учёта видимости текселей. Иными словами, данный метод позволяет создавать ещё большую глубину рельефа при небольших затратах полигонов и применении сложной геометрии. Недостаток метода — невысокая детализация силуэтов и граней.

Реализовать Parallax occlusion mapping возможно в рамках функционала API DirectX 9 Shader Model 3, однако для получения оптимальной производительности видеокарта должна обеспечивать надлежащий уровень скорости исполнения ветвлений в пиксельном шейдере. На данный момент Parallax occlusion mapping используется в некоторых компьютерных играх, например, S.T.A.L.K.E.R, Crysis, Metro 2033 и ArmA 2. Также эта технология используется в популярном бенчмарке3DMark Vantage.

Displacement mapping

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

Некоторые нерилтаймовые рендеры адаптивно тесселируют модель под displacement карту, например PRman, MentalRay, что позволяет выдавить даже ровный вертикально стоящий цилиндр из плоскости состоящей из двух треугольников.

 



Последнее изменение этой страницы: 2016-04-21; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.236.110.106 (0.026 с.)