Шейдери

Матеріал з Valve Developer Community
Перейти до: навігація, пошук
English (en)Русский (ru)Українська (uk)中文 (zh)
... Icon-Important.png
Документація Source SDK
Категорія Модоробство
Категорії Система матеріалів

Шейдер(en - Shader) — програма для одного зі ступенів графічного конвеєра, що використовується в тривимірній графіці для визначення остаточних параметрів об'єкта чи зображення. Source Source використовує шейдери для всього в 3D-світі. З шейдерами маніпулюють параметрами, що зберігаються у файлах матеріалівen!. Хоча найпоширеніші досить прості, також існують дуже складні для обробки ефектів, таких як затінення в реальному часі, освітлення та заломлення світла.

Якщо шейдер відсутній на матеріалі чи моделі, поверхня відображатиметься як білий каркас. Рожеві та чорні квадрати не є відсутністю шейдера, а натомість є відсутністю самого матеріалу.

Типи

Існує два варіанти шейдерів, піксельні шейдери та вершинні шейдери, кожен з яких виконує окреме завдання в конвеєрі візуалізації. Шейдери формують заміну конвеєру фіксованих функцій і дозволяють розробникам краще контролювати вихідні дані рендеринґу, надаючи можливість динамічно змінювати пікселі та вершини. SDK містить багато типів шейдерівen!.

Мови шейдерів

Наразі існує три основні мови шейдерів: High Level Shader Language (HLSL)en!, C for Graphics (Cg)en! та OpenGL Shading Language (GLSL)en!. Source Source використовує засновані на HLSL шейдери. Однак Cg настільки схожий, що більшість шейдерів Cg можна швидко та легко перенести на HLSL.

Моделі шейдерів

Модель шейдера визначає, як розширені методи шейдерування можуть використовуватися на графічній карті. Це заважає старішим графічним картам фізично розпізнавати нові методи затінення.

Новітні версії Source Source підтримують Shader Model 2.0 (включно з Pixel Shader 2.0b) та Shader Model 3.0.

Note.pngNote:Шейдери, написані для SM3, можуть не працювати належним чином у системах Mac і Linux через відсутність підтримки Valve's runtime graphics wrapper, togl. Ви повинні планувати створення версії SM2.0b своїх шейдерів, якщо плануєте підтримувати ці системи.

Створюючи шейдери для новіших графічних карт, важливо пам’ятати про підтримку шейдерів зі старими картами, інакше ви швидко обмежите специфікації своєї гри. Старіші карти можуть вимагати вказівки так званих «резервних шейдерів», де буде використано резервний шейдер (з використанням старішої моделі шейдера), якщо новий шейдер виходить з ладу.

Якщо ви хочете дізнатися більше про детальні характеристики різних моделей шейдерів, прочитайте Статтю на Вікіпедіїen!. Інформацію про створення шейдерів для використання в системі Source Source дивіться в Створення шейдерівen!.

Вершинні шейдери (Vertex shaders)

Вершинні шейдери застосовуються для кожної вершини, що запускається в програмованому конвеєрі. Основна мета — перетворити геометрію на координати екранного простору, щоб піксельний шейдер міг растеризувати зображення. Вершинні шейдери можуть змінювати ці позиційні координати для виконання деформації сітки. Вони також можуть отримувати додаткову інформацію від сітки, включаючи нормалі, дотичні та координати текстур. Потім вершинний шейдер записує у вихідні регістри; записані значення потім інтерполюються по вершинах у піксельних шейдерах. Вершинні шейдери не можуть створювати вершини.

Приклад вершинного шейдера, готового до використання в Source Source, наведено нижче.

Приклад вершинного шейдера

Це наскрізний шейдер, оскільки він не вносить серйозних змін у дані вершини, натомість просто передає дані на етап піксельного шейдера.

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
// визначення загального вершинного шейдера, що надається разом із цим заголовком #include "common_vs_fxc.h" // визначення вихідної структури struct VS_OUTPUT { // вектор положення (float4) float4 pos : POSITION0; // координати текстури (uv - float2) float2 texCoord : TEXCOORD0; }; // приймає вектор положення (float4) // повертає структуру VS_OUTPUT VS_OUTPUT main( float4 inPos: POSITION ) { // оголошує порожній VS_OUTPUT для заповнення VS_OUTPUT o = (VS_OUTPUT) 0; // обчислює знак вхідної позиції inPos.xy = sign( inPos.xy); // встановлює вихідну позицію за допомогою xy введення o.pos = float4( inPos.xy, 0.0f, 1.0f); // потрапляє в діапазон [0,1] o.texCoord = (float2(o.pos.x, -o.pos.y) + 1.0f)/2.0f; return o; }

Піксельні шейдери (Pixel shaders)

Піксельні шейдери застосовуються до кожного пікселя, відображеного на екрані. Піксельний шейдер очікує введення від інтерпольованих значень вершин, які потім використовує для растеризації зображення. Піксельні шейдери можуть створити величезний діапазон ефектів, пов’язаних із кольором окремих пікселів, таких як заломлення світла, попіксельне освітлення або відображення.

Нижче наведено приклад піксельного шейдера, готового до використання в Source Source.

Приклад піксельного шейдера

Наведений нижче піксельний шейдер призначений для використання як шейдер після обробки та створює ефект відтінків сірого.

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
// вкажіть семплер текстури, фактичне джерело цього вказано у vmt sampler2D Texture0 : register( s0 );<br> // той самий стиль оголошення функції, що й у вершинних шейдерах // піксельні шейдери повертають значення кольору пікселя (отже, float4) float4 main( float2 texCoord : TEXCOORD0 ) : COLOR { // вибірка текстури за вказаними координатами текстури float4 tex = tex2D( Texture0, texCoord );<br> // відтінки сірого кольору пікселів // - виконує скалярний добуток між кольором пікселя та вказаним вектором // - 0,222, 0,707, 0,071 знайдено під час обробки зображень для ефектів градації сірого. float4 grey = dot(float3(0.222, 0.707, 0.071), tex);<br> // повертає колір пікселя у формі float4. return grey; }

Застосування шейдерів у Source Source

Source Source забезпечує дві окремі форми шейдерів, Postprocess і Per-Object, більшість ефектів і матеріалів, що використовуються в Source Source, значною мірою покладаються на компоненти піксельних шейдерів.

Постобробка (Postprocess)

Шейдер постобробки - звичайний піксельний шейдер, що працює на кваді та відображається на весь екран. Квад тексурований копією з фрейм-буфера, піксельний шейдер може замінити вихідний рендер, щоб створити різноманітні ефекти, наприклад, базова модифікація кольору для більш просунутих процесів, таких як Motion Blur та Bloom.

Note.pngNote: Ця інформація застаріла, і файли більше не входять до SDK. sdk_bloom.cpp та sdk_bloom.ps20.fxc визначає один можливий шейдер, який можна використовувати як альтернативний приклад

Source Source надає приклад цієї форми шейдера у файлах постобробки (sdk_postprocess.cpp, sdk_postprocess_vs20.fxc, та sdk_postprocess_ps20.fxc)

Розширені шейдери пост обробки, як-от шейдери Bloom і Motion Blur, що входять до Source Source, також можуть потребувати цілі рендеринґу. Щоб отримати додаткові відомості про інтеґрацію шейдера постобрабки з модом, дивіться Спеціальні ефекти постобробкиen!.

Пооб'єктний шейдер (Per-Object shader)

Пооб’єктний шейдер у системі вихідного коду використовується для будь-якого об’єкта з посиланням на шейдер у відповідному файлі .vmt, наприклад моделі чи малюнку. Пооб'єктний шейдер може бути використаний для створення заломлюючого матеріалу, динамічної зміни вершин моделі або інших розширених ефектів візуалізації.

Source Source надає приклад пооб'єктного шейдеру у файлах карти освітлення ( sdk_lightmap.cpp, sdk_lightmap_vs20.fxc, and sdk_lightmap_ps20.fxc)

Зовнішні посилання