Direct3D 11

Direct3D 11 (D3D11) — компонент інтерфейсу програмування додатків (англ. API) DirectX 11, 11-та версія Direct3D, наступник Direct3D 10/10.1. Direct3D 11 забезпечує взаємодію між операційною системою та програмами з драйверами відеокарти. Частково D3D11 працює на відкритих рівнях Direct3D 9-10. Фактично нова версія DirectX 11 є розширеною і кращою версією свого попередника DirectX 10. Найбільш серйозною відмінністю між попередньою й новою версіями API є модуль теселяції, який присутній в DirectX 11.

Перші версії з'явилися в листопаді 2008 року. Офіційна, фінальна версія вийшла 22 жовтня 2009 року в складі Windows 7. 28 жовтня 2009 DirectX 11 став офіційно доступний для Windows Vista і Windows Server 2008 за допомогою завантаження через Windows Update.

Теселяція[ред. | ред. код]

У D3D11 додається 3 додаткових стадії конвеєра візуалізації, метою введення яких є ефективна теселяція поверхонь. Теселяція не є абсолютно новою технологією, вперше її почали використовувати відеопроцесори Xenos, які були розроблені компанією AMD для ігрових консолей Xbox 360 в 2005 році. Проте, модуль теселяції використаний в DirectX 11 є стійкішим і гнучкішим, ніж модуль, використаний в графічних процесорах.

Конвеєр D3D11 включає три нових стадії між стадіями вершинного і геометричного шейдеру. Дві з них є програмованими (стадії оболонкового (hull shader) і domain шейдерів) і одна — конфігурується (стадія теселяції). Оболончатий шейдер викликається для кожного патча. Як вхідні дані використовуються контрольні точки патча з вершинного шейдера. Оболончатий шейдер має два основних застосування. Перше (опційно) — це конвертація контрольних точок з одного уявлення в інше. Після цього шейдера контрольні точки пересилаються безпосередньо далі, минаючи теселятор. Інше застосування — обчислення підходящого параметра теселяції, який потім передається на стадію теселяції. Такий підхід дозволяє робити адаптивну теселяцію, яка може бути використана у випадку видозалежних рівнів деталізації (LOD). Параметр теселяції визначається для кожної грані патчу і варіюються в діапазоні від 2 до 64. Це означає, що кожна грань трикутного (або квадратного) патчу може бути розбита на 2 (або максимум 64) грані.

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

Domain shader оперує координатами параметризації (parameterization coordinates) патча для кожної вершини роздільно, хоча є можливість отримати доступ по трансформованим контрольним точкам для всього патча. Domain шейдер відправляє всю інформацію про вершини (позицію, текстурні координати, тощо) в геометричний шейдер (або на стадію кліпування, якщо геометричний шейдер не заданий). Він оцінює представлення поверхні в кожній точці. На даній стадії може бути застосований метод карт зміщення (displacement mapping).

Обчислювальні шейдери і невпорядкована пам'ять[ред. | ред. код]

Direct3D 11 вводить новий тип шейдера — обчислювальний шейдер (Compute Shader) який викликається як регулярний масив потоків. Потоки діляться на групи. Кожна група має 32 Кб пам'яті, що розділяється між потоками групи. Таким чином потоки в групі можуть обмінюватися результатами, покращуючи свою продуктивність. Також потоки можуть виконувати зчитування й запис з довільним доступом до графічних ресурсів: текстурам, масивам вершин, та інших. Ці доступи до пам'яті невпорядковані, хоча синхронізація різних інструкцій здійснюється, коли це дійсно необхідно.

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

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

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

DirectCompute[ru] — головним чином це комунікація даних між потоками і величезний вибір примітивів для випадкового доступу і потокових операцій введення/виведення. Ці функції викликають простіші і швидші реалізації вже використовуємих методик, таких як створення зображень, а також розкривають нові методи, які можуть діяти на апаратних засобах Direct3D11.

Фактично й на графічних процесорах попередніх поколінь виробники відеокарт реалізовували подібні функції, які отримували фірмове найменування і використання — технології AMD FireStream і NVIDIA CUDA. Компанія Microsoft в DirectX 11 вирішила уніфікувати розширені обчислювальні можливості відеокарт, дозволяючи створювати програмний код, що виконується на всіх нових відеоприскорювачах, не залежно від виробника графічного процесора. Використання DirectCompute[ru] відкриває нові горизонти: проста обробка кадрів і відеопотоку, кращий штучний інтелект, реалістичніша фізика і т. ін..

Багаторівнева візуалізація[ред. | ред. код]

Direct3D 10 дозволяє передавати команди візуалізації тільки з одного потоку (на даний момент існує спеціальний багатопотоковий режим, але через низьку продуктивність Корпорація Майкрософт не рекомендує використовувати його). Як відомо, передача команд візуалізації через Direct3D потребує використання додаткових обчислювальних ресурсів процесора. Враховуючи тенденцію збільшення числа ядер центрального процесора, вводиться підтримка новішої багатопоточності, щоб розподіляти цю роботу між декількома потоками, тим самим виконуючи її більш ефективно.

Direct3D 11 дає можливість створювати дисплейні списки з декількох потоків і виконувати їх з головного потоку візуалізації. Крім того, пристрій, який створює ресурси, було винесено з контексту, який передає команди візуалізації. Це дозволяє створювати ресурси не синхронно. Відкладений контекст (Deferred Contex) використовують для створення дисплейних списків, а прямий контекст (Immediate Context) для передачі команд візуалізації на GPU, включаючи обробку дисплейних списків, створених у відкладених контекстах.

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

Два нових формати стиснення текстур[ред. | ред. код]

Найбільший об'єм пам'яті в іграх найчастіше надається текстурам, тому стає зрозумілим прагнення розробників вдосконалити стиснення текстур, яке необхідне для мінімізації об'ємів вживаної пам'яті і зниження вимог до її пропускної спроможності без впливу на необхідний для візуалізації час. DirectX 11 дає розробникам новоспечені формати стиснення (BC6 для HDR-текстур і BC7 для LDR-зображень і карт нормалей), які мають допомогти їм досягти високоякісної візуалізації, не жертвуючи при цьому продуктивністю.

DirectX 11 в іграх[ред. | ред. код]

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

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

Інші можливості[ред. | ред. код]

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

Додано два нові формати для стискання текстур — BC6 і BC7. BC6 підтримує широкий динамічний діапазон RGB текстур, використовуючи при цьому 1 байт на кожен тексель (замість 6 байт у разі 6-бітних RGB речових текстури). BC7 підтримує вузький динамічний діапазон RGB або RGBA[en] текстур. Він також використовує 1 байт на тексель (як DXT5/BC3), але надає значно кращу якість у порівнянні з форматами текстур D3D10. Обидва нових формати використовують кілька типів блоків — утиліта для стискання обирає відповідний тип блоку на основі його змісту.

Формати блоків стиснення D3D9 і D3D10 засновані на ідеї, що кожен блок 4 × 4 текселей містить всі свої значення у вигляді однієї лінії, і біти кожного текселя кодують позицію в цій лінії. Наприклад, в DXT1/BC1 рядок у просторі RGB представляє дві кінцеві точки RGB, і кожен тексель використовує два біти, щоб вказати який колір використовується з чотирьох точок вздовж лінії.

Нові формати D3D11 підтримують типи блоків з однією, двома і навіть трьома (у разі BC7) колірними лініями. Існує компроміс між числом ліній і числом точок вздовж такої лінії, оскільки кожен блок займає однаковий об'єм пам'яті. В принципі, блок 4 × 4 з двома кольоровими лініями вимагає додатково 16 біт на кожен блок для задання яка лінія кожного текселя була пов'язана з ним (у випадку трьох колірних ліній буде потрібно ще більше біт). Для зниження вимог до пам'яті підтримується тільки невеликий набір можливих моделей колірних ліній. Для кожного блоку утиліта упаковки вибирає найкращий варіант з цієї підмножини.

Direct3D 11 має жорсткішу специфікацію текстур. Результати декомпресії повинні бути точними і субтексельна / субміп фільтрація повинна забезпечувати точність не менше 8 біт.

Direct3D 11 дозволяє використовувати текстури, що мають максимальний розмір в діапазоні від 8K-16K текселей. Зазначимо, що 16K х 16K DXT1/BC1 текстура займає 128MB — не так багато ігор буде використовувати такі великі текстури, але це може бути слушно для методик наприкладм мегатекстури[ru]. Загалом, тепер у D3D11 ресурс може мати розмір до 2 Гб.

Апаратне забезпечення може додатково підтримувати (опційно) дійсні числа з плаваючою точкою подвійної точності.

На Gamefest 2008 також був представлений слайд з безліччю інших нововведень, деталі яких не були пояснені:

  • Адресований потоковий висновок (Addressable Stream Out)
  • Непряма замальовка (Draw Indirect)
  • Покращений Gather4 (Improved Gather4)
  • Instance programming model для геометричних шейдерів (Geometry shader instance programming model)
  • Min-LOD texture clamps
  • Conservative oDepth
  • Pull-model attribute eval
  • Read-only depth or stencil views

DirectX 11 і керований код[ред. | ред. код]

SlimDX і SharpDX підтримують DirectX 11. XNA — ні.

Ігрові рушії з підтримкою DirectX 11[ред. | ред. код]

Див. також[ред. | ред. код]

Посилання[ред. | ред. код]