Шейдер.Види
Шейдер (англ. Shader) — це програма для одного із ступенів графічного конвеєра, що використовується в тривимірній графіці для визначення остаточних параметрів об'єкта чи зображення. Вона може включати в себе довільної складності опис поглинання та розсіювання світла, накладення текстури, віддзеркалення і заломлення, затінення, зміщення поверхні і ефекти пост-обробки.
Програмовані шейдери гнучкі та ефективні. Складні на вигляд поверхні можуть бути візуалізовані за допомогою простих геометричних форм. Наприклад, шейдери можуть бути використані для малювання поверхні із тривимірної керамічної плитки на абсолютно плоскій поверхні.
Потреба в шейдерах
У програмних графічних движках весь ланцюжок рендеринга - від визначення видимих частин сцени до накладення текстури - писалася розробником гри. У цей ланцюжок можна було включати власні нестандартні відеоефекти. Але з появою відеоакселераторів розробник виявився обмежений тим набором ефектів, який закладений в апаратне забезпечення.
Для того, щоб складати складні відеоефекти з атомарних операцій, і були винайдені шейдери. Попередниками шейдеров були процедурна генерація текстур (широко застосовувалася в Unreal для створення анімованих текстур води і вогню) і мультитекстурирование (на ньому був заснований мову шейдеров, що застосовувався в Quake 3). Але і ці механізми не забезпечують такої гнучкості, як шейдери.
Типи шейдерів
В даний час шейдери поділяються на чотири типи: вершинні, геометричні, параллаксні і фрагментні (піксельні).
Вершинні шейдери (Vertex Shader) Вершинний шейдер оперує даними вершин Багатогранників. До таких даних, зокрема, відносяться координати вершини в просторі, текстурні координати, тангенс-вектор, вектор бінормалі, вектор нормалі. Вершинний шейдер може бути використаний для видового і перспективного перетворення вершин, генерації текстурних координат, розрахунку освітлення і т. д.
Геометричні шейдери (Geometry Shader) Геометричний шейдер, на відміну від вершинного, здатний обробити не лише одну вершину, але і цілий примітив. Це може бути відрізок (дві вершини) і трикутник (три вершини), а за наявності інформації про суміжних вершинах (adjacency) може бути оброблено до шести вершин для трикутного примітиву. Крім того геометричний шейдер здатний генерувати примітиви «на льоту», не залучаючи при цьому центрального процесора. Вперше почав використовуватися на відеокартах Nvidia серії 8.
Фрагментні (Піксельні) шейдери (Pixel Shader) Фрагментний Шейдер працює з фрагментами зображення. Під фрагментом зображення в даному випадку розуміється піксель, якому поставлено у відповідність деякий набір атрибутів, таких як колір, глибина, текстурні координати. Фрагментний Шейдер використовується на останній стадії графічного конвеєра для формування фрагмента зображення.
Шейдери були розроблені для того, щоб мати змогу відтворювати складні відеоефекти з атомарних операцій. Попередниками шейдерів були процедурна генерація текстур (що широко застосовувалася в Unreal для створення анімованих текстур води і вогню) і мультитекстуровання (на ньому була заснована мова шейдерів, що застосовувався в Quake 3) . Але і ці механізми не забезпечують такої гнучкості, як шейдери.
Шейдерные языки
Впервые использованные в системе RenderMan компании Pixar, шейдеры получали всё большее распространение со снижением цен на компьютеры. Основное преимущество от использования шейдеров — их гибкость, упрощающая и удешевляющая цикл разработки программы, и при том повышающая сложность и достоверность визуализируемых сцен.
Шейдерные языки обычно содержат специальные типы данных, такие как матрицы, семплеры, векторы, а также набор встроенных переменных и констант для удобной интеграции со стандартной функциональностью 3D API Поскольку компьютерная графика имеет множество сфер приложения, для удовлетворения различных потребностей рынка было создано большое количество шейдерных языков.
Профессиональный рендеринг
Данные шейдерные языки ориентированы на достижение максимального качества визуализации. Описание свойств материалов сделано на максимально абстрактном уровне, для работы не требуется особых навыков программирования или знания аппаратной части. Такие шейдеры обычно создаются художниками с целью обеспечить «правильный вид», подобно наложению текстуры, источников света и другим аспектам их работы.
Обработка таких шейдеров обычно представляет собой ресурсоёмкую задачу. Совокупная вычислительная мощность, необходимая для обеспечения их работы, может быть очень велика, так как используется для создания фотореалистичных изображений. Основная часть вычислений при подобной визуализации выполняется большими компьютерными кластерами.
Шейдерный язык RenderMan
Шейдерный язык RenderMan, описанный в Спецификации интерфейса RenderMan, является фактическим стандартом для профессионального рендеринга. API RenderMan, разработанный Робом Куком, используется во всех работах студии Pixar. Он также является первым из реализованных шейдерных языков.
Шейдерный язык Gelato
NVIDIA Gelato представляет собой оригинальную гибридную систему рендеринга изображений и анимации трехмерных сцен и объектов, использующую для расчетов центральные процессоры и аппаратные возможности профессиональных видеокарт серии Quadro FX.
Основополагающим принципом, которого неукоснительно придерживаются разработчики, является бескомпромиссное качество финального изображения, не ограниченное ничем, в том числе — современными возможностями видеокарт. Как производственный инструмент, способный создавать конечный продукт высокого качества, Gelato предназначен для профессионального использования в таких областях как кино, телевидение, промышленный дизайн и архитектурные визуализации.
Рендеринг в реальном времени
Шейдерный язык OpenGL
Шейдерный язык 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.0
dcl_position v0
dcl_texcoord v3
m4x4 oPos, v0, c0
mov oT0, v3
Выполняет обработку цветовых данных, полученных при рисовании треугольника. Оперирует с текстурами и цветом. Количество инструкций значительно ограничено, так, к примеру, в версии 1.4 оно не может быть больше 32. Пример фрагмента кода:
ps.1.4
texld r0, t0
mul r0, r0, v0
Высокоуровневый шейдерный язык DirectX (HLSL — High Level Shader Language)
Является надстройкой над DirectX ASM. По синтаксису сходен с C, позволяет использовать структуры, процедуры и функции.