Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
розділ 3(рамки, нумерація).docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
366.13 Кб
Скачать

3.2. Конвеєр візуалізації та шейдери xna

В XNA існує програмований тип конвеєра. Розглянемо його детальніше.

Сучасні відео-карти підтримують конвеєрну архітектуру обробки даних, яка дозволяє значно збільшити швидкість роботи графічних додатків. Графічний конвеєр складається з декількох етапів, які зображено на рис. 3.6.

Рис. 3.6 Етапи створення графічного конвеєра

На вхід графічного конвеєра надходить інформація про вершини і графічні примітиви, які потрібно малювати на екрані.

Vertex Data – інформація про вершини в вершинних буферах.

Primitive Data – інформація про використовувані примітиви (точки, лінії, трикутники).

Tesselation – розбиття складних об'єктів на вершини і трикутники, збереження їх у вершинні буфери.      Інформація про вершини надходить на етапі Vertex Processing.

Vertex Processing – геометричні перетворення над вершинами, на цьому етапі виконуються перетворення з локальних координат об'єктів в екранні. Також на цьому етапі проводиться обчислення різних параметрів вершин (наприклад, інтенсивності освітлення для моделі зафарбування по Гуро).

Geometry Processing – відсікання невидимих ​​об'єктів, граней та інших геометричних операції.

Далі інформація про кожний піксель надходить на етапі Pixel Processing, на якому обчислюється значення кольору пікселя.

Pixel Processing – фарбування, текстурування.

Texture Sampler, Texture Surface – дозволяють працювати з текстурами.

Pixel Rendering – на даному етапі виходить підсумкове значення кольору пікселя і він малюється на екрані.

У даного підходу є певні недоліки: графічний конвеєр діє заздалегідь заданою програмою і програміст ні яким чином не може вплинути на хід обробки тривимірних об'єктів.

У ході розвитку відео-карт, конвеєрна архітектура була змінена таким чином, щоб підтримувати можливість модифікації програми графічного конвеєра. Такий модифікований графічний конвеєр зазвичай називається програмованим конвеєром.

Програмований конвеєр і шейдери дозволяють змінити дану програму на етапах:

Vertex Processing – для обробки кожної вершини.

Pixel Processing – для обробки кожного пікселя.

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

Але в XNA Framework міститься клас BasicEffect, який реалізує простий шейдер, який практично повторює реалізацію стандартного графічного конвеєра. Даний клас позбавляє початківців розробників від вивчення та розробки власних шейдерів, що сприяє більш швидкій розробці програм.

Таким чином, BasicEffect – це вбудована в XNA реалізація базового шейдера, який підтримує: джерела світла, попіксельне освітлення, туман, текстурування і т.д.

Варто відзначити, що XNA Framework використовує формат опису шейдерів аналогічний формату, який використовується в DirectX.

DirectX 9 і XNA 4.0 підтримують 2 види шейдерів (рис. 3.7):

1. Вершинний;

2. Піксельний або фрагментний.

Вершинний шейдер (Vertex Shader). У ньому виконуються операції над вершинами: трансформації, зміщення, обчислення параметрів матеріалу у вершинах і т.д.

Вершинний шейдер оперує даними, зіставленими з вершинами багатогранників. До таких даних, зокрема, відносяться координати вершини в просторі, текстурні координати, тангенс-вектор, вектор бінормалі, вектор нормалі. Вершинний шейдер може бути використаний для видового і перспективного перетворення вершин, генерації текстурних координат, розрахунку освітлення і т. д.

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

Піксельний (Pixel Shader) або фрагментний шейдер. У ньому виконуються операції над пікселями: освітлення, текстурування і т.д.

Рис. 3.7 Вершинний та піксельний шейдери

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

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

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

Як мінімум, піксельні шейдери повинні вертати на виході дані про колір, які потім переводяться безпосередньо в кольори, які відображаються на екрані. Піксельні шейдери використовуються в основному для текстурування, освітлення та обробки зображень.

Починаючи з версії 10 DirectX підтримує також і геометричні шейдери, однак, оскільки XNA Framework на сьогоднішній день базується на DirectX версії 9, геометричні шейдери в ньому не підтримуються.

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

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

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

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

Останнім з розглянутих шейдерів програми можна розглянути опис технік. Техніка описує метод обробки об'єктів, тобто вказує які саме з описаних вершинних та піксельних шейдерів слід застосувати для оброблюваного об'єкта.

Файл з шейдерною програмою може містити довільну кількість різних технік, що буде використовуватися для наступного:

- для різних ефектів – файл з шейдерами може містити абсолютно різні ефекти, наприклад, ефекти анімації, освітлення, шейдери для систем частинок. Для кожного з таких ефектів можна використовувати різні техніки;

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

- для різних ступенів якості – в деяких випадках має сенс погіршувати якість шейдера, тим самим збільшуючи швидкодію гри. Також можна розробити техніки різних ступенів видалення об'єктів від спостерігача. Не завжди гарною практикою є використовування техніки, яка створює найбільш красиве зображення, для об'єктів, які розташовані далеко від камери. Візуальних ефект все одно буде слабо помітний, а продуктивність буде достатньо низькою.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]