Шейдери
Шейдер(en - Shader) — програма для одного зі ступенів графічного конвеєра, що використовується в тривимірній графіці для визначення остаточних параметрів об'єкта чи зображення. Source використовує шейдери для всього в 3D-світі. З шейдерами маніпулюють параметрами, що зберігаються у файлах матеріалівen!. Хоча найпоширеніші досить прості, також існують дуже складні для обробки ефектів, таких як затінення в реальному часі, освітлення та заломлення світла.
Якщо шейдер відсутній на матеріалі чи моделі, поверхня відображатиметься як білий каркас. Рожеві та чорні квадрати не є відсутністю шейдера, а натомість є відсутністю самого матеріалу.
Типи
Існує два варіанти шейдерів, піксельні шейдери та вершинні шейдери, кожен з яких виконує окреме завдання в конвеєрі візуалізації. Шейдери формують заміну конвеєру фіксованих функцій і дозволяють розробникам краще контролювати вихідні дані рендеринґу, надаючи можливість динамічно змінювати пікселі та вершини. SDK містить багато типів шейдерівen!.
Мови шейдерів
Наразі існує три основні мови шейдерів: High Level Shader Language (HLSL)en!, C for Graphics (Cg)en! та OpenGL Shading Language (GLSL)en!. Source використовує засновані на HLSL шейдери. Однак Cg настільки схожий, що більшість шейдерів Cg можна швидко та легко перенести на HLSL.
Моделі шейдерів
Модель шейдера визначає, як розширені методи шейдерування можуть використовуватися на графічній карті. Це заважає старішим графічним картам фізично розпізнавати нові методи затінення.
Новітні версії Source підтримують Shader Model 2.0 (включно з Pixel Shader 2.0b) та Shader Model 3.0.
togl
. Ви повинні планувати створення версії SM2.0b своїх шейдерів, якщо плануєте підтримувати ці системи.Створюючи шейдери для новіших графічних карт, важливо пам’ятати про підтримку шейдерів зі старими картами, інакше ви швидко обмежите специфікації своєї гри. Старіші карти можуть вимагати вказівки так званих «резервних шейдерів», де буде використано резервний шейдер (з використанням старішої моделі шейдера), якщо новий шейдер виходить з ладу.
Якщо ви хочете дізнатися більше про детальні характеристики різних моделей шейдерів, прочитайте Статтю на Вікіпедіїen!. Інформацію про створення шейдерів для використання в системі Source дивіться в Створення шейдерівen!.
Вершинні шейдери (Vertex shaders)
Вершинні шейдери застосовуються для кожної вершини, що запускається в програмованому конвеєрі. Основна мета — перетворити геометрію на координати екранного простору, щоб піксельний шейдер міг растеризувати зображення. Вершинні шейдери можуть змінювати ці позиційні координати для виконання деформації сітки. Вони також можуть отримувати додаткову інформацію від сітки, включаючи нормалі, дотичні та координати текстур. Потім вершинний шейдер записує у вихідні регістри; записані значення потім інтерполюються по вершинах у піксельних шейдерах. Вершинні шейдери не можуть створювати вершини.
Приклад вершинного шейдера, готового до використання в Source, наведено нижче.
Приклад вершинного шейдера
Це наскрізний шейдер, оскільки він не вносить серйозних змін у дані вершини, натомість просто передає дані на етап піксельного шейдера.
Піксельні шейдери (Pixel shaders)
Піксельні шейдери застосовуються до кожного пікселя, відображеного на екрані. Піксельний шейдер очікує введення від інтерпольованих значень вершин, які потім використовує для растеризації зображення. Піксельні шейдери можуть створити величезний діапазон ефектів, пов’язаних із кольором окремих пікселів, таких як заломлення світла, попіксельне освітлення або відображення.
Нижче наведено приклад піксельного шейдера, готового до використання в Source.
Приклад піксельного шейдера
Наведений нижче піксельний шейдер призначений для використання як шейдер після обробки та створює ефект відтінків сірого.
Застосування шейдерів у Source
Source забезпечує дві окремі форми шейдерів, Postprocess і Per-Object, більшість ефектів і матеріалів, що використовуються в Source, значною мірою покладаються на компоненти піксельних шейдерів.
Постобробка (Postprocess)
Шейдер постобробки - звичайний піксельний шейдер, що працює на кваді та відображається на весь екран. Квад тексурований копією з фрейм-буфера, піксельний шейдер може замінити вихідний рендер, щоб створити різноманітні ефекти, наприклад, базова модифікація кольору для більш просунутих процесів, таких як Motion Blur та Bloom.
sdk_bloom.cpp
та sdk_bloom.ps20.fxc
визначає один можливий шейдер, який можна використовувати як альтернативний приклад Source надає приклад цієї форми шейдера у файлах постобробки (sdk_postprocess.cpp, sdk_postprocess_vs20.fxc, та sdk_postprocess_ps20.fxc)
Розширені шейдери пост обробки, як-от шейдери Bloom і Motion Blur, що входять до Source, також можуть потребувати цілі рендеринґу. Щоб отримати додаткові відомості про інтеґрацію шейдера постобрабки з модом, дивіться Спеціальні ефекти постобробкиen!.
Пооб'єктний шейдер (Per-Object shader)
Пооб’єктний шейдер у системі вихідного коду використовується для будь-якого об’єкта з посиланням на шейдер у відповідному файлі .vmt , наприклад моделі чи малюнку. Пооб'єктний шейдер може бути використаний для створення заломлюючого матеріалу, динамічної зміни вершин моделі або інших розширених ефектів візуалізації.
Source надає приклад пооб'єктного шейдеру у файлах карти освітлення ( sdk_lightmap.cpp
, sdk_lightmap_vs20.fxc
, and sdk_lightmap_ps20.fxc
)