Шейдер (англ. Shader) — програма для одного із ступенів графічного конвеєра, що використовується в тривимірній графіці для визначення остаточних параметрів об'єкта чи зображення. Вона може містити в собі довільної складності опис поглинання та розсіювання світла, накладення текстури, віддзеркалення і заломлення, затінення, зміщення поверхні і ефекти пост-обробки.
Програмовані шейдери гнучкі та ефективні. Складні на вигляд поверхні можуть бути візуалізовані за допомогою простих геометричних форм. Наприклад, шейдери можуть бути використані для малювання поверхні із тривимірної керамічної плитки на абсолютно плоскій поверхні.
Потреба в шейдерах
В програмних графічних рушіях весь ланцюжок рендерингу — від визначення видимих частин сцени до накладення текстури — створювався розробником ігор. У цей ланцюжок можна було включати власні нестандартні відеоефекти. З появою перших відеоакселераторів розробник виявився обмежений тим набором ефектів, який закладений в апаратне забезпечення. Ось два приклади.
- Спробуйте пірнути під воду в Quake 2 на програмному і на OpenGL-рендерінгу. При апаратно прискореній картинці, вода там — просто синій світлофільтр, в той час як в програмному є реалістичніший ефект води.
- В Counter-Strike ефект засліплення від світлошумової гранати на апаратному рендерінгу — білий спалах, на програмному — білий спалах і пікселізований екран.
Шейдери були розроблені для того, щоб мати змогу відтворювати складні відеоефекти з атомарних операцій. Попередниками шейдерів були процедурна генерація текстур (що широко застосовувалася в Unreal для створення анімованих текстур води і вогню) і мультитекстуровання (на ньому була заснована мова шейдерів, що застосовувався в Quake 3) . Але і ці механізми не забезпечують такої гнучкості, як шейдери.
Типи шейдерів
В даний час шейдери поділяються на чотири типи: вершинні, геометричні, параллаксні і фрагментні (піксельні).
Вершинні шейдери (Vertex Shader)
Вершинний шейдер оперує даними вершин багатогранників. До таких даних, зокрема, належать координати вершини в просторі, текстурні координати, тангенс-вектор, вектор бінормалі, вектор нормалі. Вершинний шейдер може бути використаний для видового і перспективного перетворення вершин, генерації текстурних координат, розрахунку освітлення і т. д.
Геометричні шейдери (Geometry Shader)
Геометричний шейдер, на відміну від вершинного, здатний обробити не лише одну вершину, але і цілий примітив. Це може бути відрізок (дві вершини) і трикутник (три вершини), а за наявності інформації про суміжних вершинах (adjacency) може бути оброблено до шести вершин для трикутного примітиву. Крім того геометричний шейдер здатний генерувати примітиви «на льоту», не залучаючи при цьому центрального процесора.
Вперше почав використовуватися на відеокартах Nvidia серії 8.
Фрагментні (піксельні) шейдери (Pixel Shader)
Фрагментний Шейдер працює з фрагментами зображення. Під фрагментом зображення в даному випадку розуміється піксель, якому поставлено у відповідність деякий набір атрибутів, таких як колір, глибина, текстурні координати. Фрагментний Шейдер використовується на останній стадії графічного конвеєра для формування фрагмента зображення.
Шейдерні мови
Вперше використані в системі RenderMan компанії Pixar, шейдери набували все більшого поширення зі зниженням цін на комп'ютери. Основна перевага використання шейдерів — їх гнучкість, що спрощує і здешевлює цикл розробки програми, і при тому що підвищує складність і достовірність сцен, що візуалізуються.
Шейдерні мови зазвичай містять спеціальні типи даних, такі як колір або нормаль. Оскільки комп'ютерна графіка має безліч сфер застосування, для задоволення різних потреб ринку була створена велика кількість шейдерних мов.
Професійний рендерінг
Дані шейдерні мови орієнтовані на досягнення максимальної якості візуалізації. Опис властивостей матеріалів зроблено на максимально абстрактному рівні, для роботи не потрібно особливих навичок програмування або знання апаратної частини. Такі шейдери зазвичай створюються художниками з метою забезпечити «правильний вигляд», подібно до накладення текстури, джерел кольору та інших аспектів їхньої роботи.
Обробка таких шейдерів звичайно являє собою ресурсномісткі завдання. Сукупна обчислювальна потужність, необхідна для забезпечення їх роботи, може бути дуже велика, тому що використовується для створення фотореалістичних зображень. Основна частина обчислень при подібній візуалізації виконується потужними комп'ютерними кластерами.
Шейдерна мова RenderMan, описана в Специфікації інтерфейсу RenderMan, є фактичним стандартом для професійного рендерінгу. API RenderMan, розроблений Робом Куком, використовується у всіх роботах студії Pixar. Вона також є першою з реалізованих шейдерних мов.
У більшості випадків реалізація стандарту Renderman - це набір програм, що викликаються з командного рядка і відіграють важливу роль в процесі рендеринга. Стандарт розрізняє поняття файлів опису сцени та геометрії - RIB-файлів, і файлів опису матеріалів — SL-файлів, або шейдерів. Всі ці файли мають простий текстовий формат, описаний в специфікації. Файли шейдерів являють собою мініпрограми на сильно спрощеному діалекті мови C.
Шейдерна мова Gelato
NVIDIA Gelato є оригінальною гібридною системою рендерінгу зображень і анімації тривимірних сцен і об'єктів, що використовує для розрахунків центральні процесори і апаратні можливості професійних відеокарт серії Quadro FX.
Основним принципом, якого неухильно дотримуються розробники, є безкомпромісна якість фінального зображення, не обмежену нічим, у тому числі — сучасними можливостями відеокарт. Як виробничий інструмент, здатний створювати кінцевий продукт високої якості, Gelato призначений для професійного використання в таких галузях як кіно, телебачення, промисловий дизайн та архітектурні візуалізації.
Рендерінг в реальному часі
Шейдерна мова OpenGL: GLSL
Шейдерна мова OpenGL носить назву GLSL (The OpenGL Shading Language). GLSL заснована на мові ANSI C. Більшість можливостей мови ANSI C збережено, також до них додано векторні та матричні типи даних, що часто застосовуються при роботі з тривимірною графікою.
У контексті GLSL шейдером називається незалежно компільована одиниця, написана цією мовою. Програмою називається набір шейдерів, пов'язаних разом. У версії OpenGL 4.3 додано шейдери обчислення (compute shader) — які представляють собою спрощену форму ядер OpenCL і збільшують гнучкість графічного конвеєра, дозволяючи реалізувати динамічно модифіковані текстури, програмно-генеровану геометрію та інше.
Мова програмування Cg
Розроблена nVidia спільно з Microsoft (аналогічна (по суті) мова від Microsoft має назву 'HLSL' та додана до DirectX 9). 'Cg' розшифровується як C for Graphics. Мова дуже схожа на C, вона використовує схожі типи даних (int, float, а також спеціальний 16-бітний тип з рухомою комою — half). Підтримуються функції і структури. Мова має своєрідні оптимізації у вигляді упакованих масивів — оголошення типу «float a [4]» і «float 4 a» відповідають різним типам. Друге оголошення - це й є упакований масив, операції з яким виконуються швидше, ніж із звичайними масивами. Попри те, що мова розроблена nVidia, вона вільно працює і з відеокартами інших виробників, таких як AMD/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, дозволяє використовувати структури, процедури та функції.
Див. також
Посилання
IDE