Shader

Xtreme3D

Shader

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

В настоящее время шейдеры делятся на четыре типа: вершинные, геометрические, фрагментные (пиксельные) и вычислительные.

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

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

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

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

Существует три основные группы языков программирования для GPU.
К первой группе относятся языки, используемые при рендеринге изображений и анимации в таких областях, как кино, телевидение, промышленный дизайн и архитектурные визуализации:

RenderMan Shading Language (RSL) - разработан и используется студией Pixar. Является фактическим стандартом в профессиональном рендеринге.

Open Shading Language (OSL) - разработан Sony Pictures Imageworks для рендер-движка Arnold, однако поддерживается и во многих других рендер-движках. Ориентирован на рендеринг с использованием трассировки лучей, предназначен для описания BSDF - двулучевых функций поверхностного рассеивания.

Gelato - разработан компанией nVidia. Представляет собой гибридную систему рендеринга изображений и анимации, использующую для расчетов центральные процессоры и аппаратные возможности профессиональных видеокарт серии Quadro FX.

Vector Expressions (VEX) - разработан Side Effects Software как часть пакета Houdini. Является аналогом RenderMan.

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

Низкоуровневый шейдерный язык OpenGL (ARB) - по синтаксису схож с ассемблером. Доступен в виде расширений ARB_vertex_program, ARB_fragment_program. Является утвержденным промышленным стандартом.

OpenGL Shading Language (GLSL) - высокоуровневый шейдерный язык OpenGL. Основан на синтаксисе ANSI C. Большинство возможностей C сохранено; к ним добавлены векторные и матричные типы данных, часто применяющиеся при работе с трехмерной графикой. В контексте GLSL шейдером называется независимо компилируемая единица, написанная на этом языке. Программой называется набор откомпилированных шейдеров, связанных вместе.
Изначально GLSL 1.10 был доступен в виде набора расширений GL_ARB_shading_language_100, GL_ARB_shader_objects. Начиная с OpenGL 2.0, стал частью стандарта.
С релизом OpenGL 3.3, GLSL меняет нумерацию версий. Теперь номер версии GLSL соответствует версии OpenGL.

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

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

High Level Shader Language (HLSL) - высокоуровневый шейдерный язык DirectX (поддерживается также игровыми консолями Xbox и Xbox 360). Является надстройкой над DirectX ASM. По синтаксису сходен с C, позволяет использовать структуры и функции.

Третью группу составляют языки широкой специализации, предназначенные в основном для научных вычислений. Они эффективно используют многоядерные CPU и GPGPU для ускорения обработки больших массивов данных.

Sh - высокоуровневый язык программирования GPU, входит в подмножество языка С++. Изначально был разработан группой RapidMind (которая впоследствии стала частью Intel), в настоящее время распространяется по лицензии GNU LGPL и поддерживается сообществом.

Compute Unified Device Architecture (CUDA) - технология, разработанная компанией NVIDIA для параллельных вычислений на видеокартах GeForce (8 и старше), Quadro и Tesla. CUDA использует специализированный вариант языка C с набором инструкций для GPU.

OpenCL (Open Computing Language) - кроссплатформенный аналог CUDA, независимый от оборудования вычислительный API с собственным C-подобным языком программирования. Спецификация OpenCL разрабатывается консорциумом Kronos Group параллельно с OpenGL - существует возможность взаимодействия между этми двумя API.

BrookGPU - проект Стэнфордского университета. Изначально возник как язык для программирования потоковых архитектур. Представляет собой C-подобный язык, в который добавлен тип данных - массив специального вида ("поток" в терминологии языка). В 2004 году появилась его реализация для графических процессоров.