Шейдер

Шейдер


Ше́йдер.

Ше́йдер ([англ.] shader — затеняющая программа) — [компьютерная программа], предназначенная для исполнения [процессорами видеокарты (GPU)]. Шейдеры составляются на одном из специализированных [языков программирования] (см. [ниже]) и [компилируются] в [инструкции] для GPU.

Применение

Программы, работающие с [трёхмерной графикой] и видео ([игры], [GIS], [CAD], [CAM] и др.), используют шейдеры для определения параметров геометрических объектов или изображения, для изменения изображения (для создания эффектов сдвига, отражения, преломления, затемнения с учётом заданных параметров поглощения и рассеяния света, для наложения [текстур] на геометрические объекты и др.).

История

Ранее разработчики игр реализовывали [алгоритм создания изображений из геометрических объектов (рендеринг)] вручную: составляли алгоритм определения видимых частей сцены, составляли алгоритм наложения текстур, составляли алгоритмы, создающие нестандартные видеоэффекты. Для ускорения рисования некоторые алгоритмы рендеринга были реализованы на аппаратном уровне — с помощью [видеокарты]. Разработчики игр могли использовать алгоритмы, реализуемые видеокартой, но не могли заставить видеокарту исполнять их собственные алгоритмы, например, для создания нестандартных эффектов. Нестандартные алгоритмы исполнялись на центральном процессоре — более медленном процессоре, по сравнению с процессорами видеокарты. Рассмотрим два примера.

  • Вода в игре Quake 2 на программном и на OpenGL-рендеринге. При всём качестве аппаратно ускоренной картинки, вода там — просто синий светофильтр, в то время как в программном есть эффект плеска воды.
  • В игре Counter-Strike 1.6 эффект ослепления от светошумовой гранаты на аппаратном рендеринге — белая вспышка, на программном — белая вспышка и пикселизированный экран.

Для решения проблемы в видеокарты стали добавлять (аппаратно) алгоритмы, востребованные разработчиками. Вскоре стало ясно, что реализовать все алгоритмы невозможно и нецелесообразно; решили дать разработчикам доступ к видеокарте — позволить собирать блоки [графического процессора] в произвольные конвейеры, реализующие разные алгоритмы. Программы, предназначенные для выполнения на процессорах видеокарты, получили название «шейдеры». Были разработаны специальные языки для составления шейдеров. Теперь в видеокарты загружались не только данные о геометрических объектах («геометрия»), [текстуры] и другие данные, необходимые для рисования (формировании изображения), но и [инструкции] для GPU.

До начала применения шейдеров использовались [процедурная генерация текстур] (например, применялась в игре [Unreal] для создания анимированных текстур воды и огня) и [мультитекстурирование] (на нём был основан язык шейдеров, применявшийся в игре [Quake 3]). Эти механизмы не обеспечивали такой же гибкости, как шейдеры.

С появлением перенастраиваемых графических конвейеров появилась возможность проводить на GPU математические расчёты ([GPGPU]). Наиболее известные механизмы GPGPU — nVidia [CUDA], Microsoft [DirectCompute] и открытая [OpenCL].

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

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

  • вершинные (англ. vertex shader);
  • геометрические (англ. geometry shader);
  • пиксельные или фрагментные (англ. pixel shader, fragment shader).

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

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

Пример кода для вершинного шейдера на языке [DirectX ASM]:

vs.2.0
dcl_position v0
dcl_texcoord v3
m4x4 oPos, v0, c0
mov oT0, v3

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

Геометрические шейдеры впервые стали использоваться на видеокартах [Nvidia] серии 8.

Пиксельный шейдер работает с фрагментами [растрового изображения] и с [текстурами] — обрабатывает данные, связанные с пикселями (например, цвет, глубина, текстурные координаты). Пиксельный шейдер используется на последней стадии графического конвейера для формирования фрагмента изображения.

Пример кода для пиксельного шейдера на языке [DirectX ASM]:

ps.1.4
texld r0, t0
mul r0, r0, v0

Достоинства и недостатки

Достоинства:

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

Недостатки:

  • необходимость изучения нового языка программирования;
  • существование различных наборов инструкций для GPU разных производителей.

Языки программирования

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

Обычно, языки для написания шейдеров предоставляют программисту специальные типы данных (матрицы, семплеры, векторы и др.), набор встроенных переменных и констант (для взаимодействия со стандартной функциональностью 3D API).

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

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

Примечания

Литература

  • «Orange Book» — OpenGL Shading Language by Randi J. Rost, Bill M. Licea-Kane, Dan Ginsburg and John M. Kessenich. ISBN 978-0-321-63763-5

Ссылки

  • http://steps3d.narod.ru/
  • http://coremission.net/gamedev/chto-takoe-sheidery/

IDE

  • Shader Config
  • Render Monkey
  • FX Composer