Архитектура вершинных шейдеров
Рассмотрим архитектуру шейдеров, свойственную DirectX 9.0. При визуализации трехмерной графики информация передается графическому оборудованию через API визуализации, такой как Direct3D или OpenGL. Как только эта информация получена, видеокарта выполняет программу вершинного шейдера для каждой вершины. На рисунке показана 128 битная архитектура вершинных шейдеров.
Рисунок 4– Архитектура вершинных шейдеров
Выходные регистры вершинные шейдеры:
· oDn –Цвет для пиксельного шейдера diffuse (oD0) и specular (oD1);
· oPos - местоположение проекции вершины в экранном пространстве;
· oTn – выходные координаты текстуры;
· oPts.x – размер точки (скаляр);
· oFog.x – коэффициент затуманивания.
Вершины поступают потоком, который предоставляется разработчиком через API трехмерной визуализации, такой как Direct3D или OpenGL. Поток содержит всю информацию, необходимую для правильной обработки геометрии в процессе визуализации, такую как координаты местоположения, цвета и координаты текстуры. Поступившая информация помещается в соответствующие входные регистры от v0 до v15 и может использоваться программой вершинного шейдера. Это означает, что каждая вершина обрабатывается индивидуально и ее описание может содержать до 16 блоков информации, передаваемых через входные регистры.
Регистры констант доступны только для чтения, должны быть инициализированы заранее и используются для хранения статических данных шейдера. Регистры констант являются векторами и могут хранить числа с плавающей точкой, целые числа или логические значения. Регистры вершинного шейдера представляют собой четырехкомпонентные векторы, причем их отдельные компоненты могут обрабатываться параллельно или в индивидуальном порядке с помощью адресной выборки и маскирования.
Рисунок 5 – Структура регистра вершинного шейдера
Временные регистры, предназначенные для хранения генерируемых вершинным шейдером промежуточных результатов. Очевидно, что согласно своему назначению, эти регистры доступны и для чтения и для записи.
Обладая доступом к регистрам данных вершины (также известным как входные регистры), временным регистрам и регистрам констант, программа вершинного шейдера может обрабатывать поступающие вершины и управлять ими тем образом, какой посчитает необходимым разработчик. После завершения обработки необходимо поместить результаты в выходные регистры. Наиболее важный из них oPos, который должен содержать местоположение проекции вершины в экранном пространстве. Остальные регистры могут передавать дополнительную информацию, такую как цвета и итоговые координаты текстур.
После того, как вершинный шейдер закончит свою работу, информация передается в растеризатор.
Пиксельные шейдеры
Пиксельные шейдеры - это программы, выполняемые видеочипом во время растеризации для каждого пикселя изображения, они производят выборку из текстур и/или математические операции над цветом и значением глубины (Z-buffer) пикселей. Все инструкции пиксельного шейдера выполняются попиксельно, после того, как операции с трансформированием и освещением геометрии завершены. Пиксельный шейдер в итоге своей работы выдает конечное значение цвета пикселя и Z-значение для последующего этапа графического конвейера, блендинга. Наиболее простой пример пиксельного шейдера, который можно привести, это мультитекстурирование, просто смешение двух текстур (diffuse и lightmap, например) и наложение результата вычисления на пиксель.
До появления видеочипов с аппаратной поддержкой пиксельных шейдеров, у разработчиков были лишь возможности по обычному мультитекстурированию и альфа-блендингу, что существенно ограничивало возможности по многим визуальным эффектам и не позволяло делать многое из того, что сейчас доступно. И если с геометрией еще что-то можно было делать программно, то с пикселями - нет. Ранние версии DirectX (до 7.0 включительно) всегда выполняли все расчеты повершинно и предлагали крайне ограниченную функциональность по попиксельному освещению.
Пиксельные шейдеры сделали возможным освещение любых поверхностей попиксельно, используя запрограммированные разработчиками материалы. Появившиеся в NV20 пиксельные шейдеры версии 1.1 (в понимании DirectX) уже могли не только делать мультитекстурирование, но и многое другое, хотя большинство игр, использующих версию шейдеров 1.1, просто использовали традиционное мультитекстурирование на большинстве поверхностей, выполняя более сложные пиксельные шейдеры лишь на части поверхностей, для создания разнообразных спецэффектов (все знают, что вода до сих пор является наиболее частым примером использования пиксельных шейдеров в играх). Сейчас, после появления шейдеров версии 3 и поддерживающих их видеочипов, возможности пиксельных шейдеров доросли уже до того, чтобы с их помощью делать даже трассировку лучей (raytracing), пусть пока с некоторыми ограничениями.
Примеры применения пиксельных шейдеров:
· Мультитекстурирование. Несколько слоев текстур (colormap, detailmap, lightmap и т.д.). Используется во всех играх.
· Попиксельное освещение. Bump mapping. Normal mapping. С недавних пор применяется практически везде.
· Постобработка кадра. Эффекты: Bloom, Depth of Field и Motion Blur.
· Процедурные текстуры, такие, как текстура дерева или мрамора.
Дата добавления: 2016-04-14; просмотров: 2105;