Основы 3D графики: Шейдеры

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

Изначально шейдеры поддерживались исключительно программно, после чего получили аппаратную поддержку в виде Shader-блоков и ускорения DirectX и OpenGL на видеокартах. В целом, шейдеры добавили к графическому конвейеру множество новых возможностей по трансформации и освещению вершин и индивидуальной обработке пикселей так, как этого хотят разработчики каждого конкретного приложения.

img

Выделяют следующие виды шейдеров:

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

Vertex Shader (Вершинный Шейдер)

Вершинные шейдеры - это программы, выполняемые видеочипами, которые производят математические операции с вершинами (vertex, из которых состоят 3D объекты в играх), иначе говоря, они предоставляют возможность выполнять программируемые алгоритмы по изменению параметров вершин и их освещению (T&L - Transform & Lighting). Каждая вершина определяется несколькими переменными, например, положение вершины в 3D пространстве определяется координатами: x, y и z. Вершины также могут быть описаны характеристиками цвета, текстурными координатами и т.п. Вершинные шейдеры, в зависимости от алгоритмов, изменяют эти данные в процессе своей работы, например, вычисляя и записывая новые координаты и/или цвет. То есть, входные данные вершинного шейдера - данные об одной вершине геометрической модели, которая в данный момент обрабатывается. Обычно это координаты в пространстве, нормаль, компоненты цвета и текстурные координаты. Результирующие данные выполняемой программы служат входными для дальнейшей части конвейера, растеризатор делает линейную интерполяцию входных данных для поверхности треугольника и для каждого пикселя исполняет соответствующий пиксельный шейдер. Очень простой и грубый (но наглядный, надеюсь) пример: вершинный шейдер позволяет взять 3D объект красной сферы и вершинным шейдером сделать из него зеленый куб :).

Примеры применения вершинных шейдеров:

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

img

Анимация объектов. Например, травы и деревьев.

img

Реализация Скининга (skinning) для скелетной анимации персонажа. Применяется практически во всех 3d играх.

img

Toon shading/Cel shading. Используется в некоторых играх для создания эффекта "мультяшного" изображения.

img

Имитация ткани (Cloth Simulation) - для имитации поведения подобных ткани материалов.

img

Pixel Shader (Пиксельный Шейдер)

Пиксельные шейдеры - это программы, выполняемые видеочипом во время растеризации для каждого пикселя изображения, они производят выборку из текстур и/или математические операции над цветом и значением глубины (Z-buffer) пикселей. Все инструкции пиксельного шейдера выполняются попиксельно, после того, как операции с трансформированием и освещением геометрии завершены. Пиксельный шейдер в итоге своей работы выдает конечное значение цвета пикселя и Z-значение для последующего этапа графического конвейера, блендинга. Наиболее простой пример пиксельного шейдера, который можно привести: банальное мультитекстурирование, просто смешение двух текстур (diffuse и lightmap, например) и наложение результата вычисления на пиксель.

Примеры применения пиксельных шейдеров:

Мультитекстурирование. Использование нескольких слоев текстур (+colormap, detailmap, lightmap и т.д.).

img

Попиксельное освещение. Bump mapping. Normal mapping.

img

Постобработка кадра. Все эти эффекты Bloom, Depth of Field, Motion Blur...

img

Процедурные текстуры, такие, как текстура дерева или мрамора.

img

Geometry Shader (Геометрический шейдер)

Геометрический шейдер, в отличие от вершинного, способен обработать не только одну вершину, но и целый примитив. Это может быть отрезок (две вершины) и треугольник (три вершины), а при наличии информации о смежных вершинах (adjacency) может быть обработано до шести вершин для треугольного примитива. Кроме того, геометрический шейдер способен генерировать примитивы «на лету», не задействуя при этом центральный процессор.

Материал для статьи взят с сайта ixbt.com и из википедии