Як герої гри OverWatch одного разу облисіли, а ми повернули їм шевелюри

imageОднією з можливостей Parallels Desktop 12 для Mac є підтримка РС-ігор. Існують безліч ігор, доступних тільки для Windows і Xbox, і з допомогою Parallels Desktop в ці ігри можна грати на Mac без перезавантаження — всередині віртуальної машини. Чи можна вважати, що проблема ігор для PC на Mac повністю вирішена? Поки немає, але ми працюємо над цим. У цій статті наведено кілька прикладів того, як ми це робимо.

Чому складно підтримати DirectX в повному обсязі

Насправді, віртуальна машина РС, що дозволяє запускати Windows на Mac, сама по собі не гарантує, що в ній будуть працювати PC-ігри. Справа в тому, що більшості ігор потрібна підтримка DirectX певної версії з боку відеоадаптера, і забезпечення цієї підтримки повністю лягає на плечі розробників відеодрайверів. Природно, що відеодрайвера, розроблені для «справжніх» відеокарт Nvidia, AMD і Intel, у віртуальній машині працювати не будуть.

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



Ми забезпечуємо підтримку DirectX, починаючи з найперших версій Parallels Desktop для Mac. По мірі еволюції Windows і DirectX, Parallels Desktop також розвивався. Ми підтримували DirectX 7, DirectX 8, DirectX 9, та вже кілька років — і DirectX 10, що в світлі сказаного особливо важливо. Але та частина функціональності DirectX 10, що стосується роботи відеодрайвера — правила, за якими треба трактувати його команди і створювати зображення — описана в документації досить стисло. Кількість різних комбінацій, станів, викликів — дуже велика, і просто прочитати специфікацію, щоб створити по ній однозначний програмний код, який дозволить запускатися і працювати будь PC-грі, на жаль, нереально.

Крім того, слід знати, що ми забезпечуємо підтримку DirectX 10 через OpenGL, тобто перетворимо команди для DirectX команди OpenGL. Але одна і та ж конструкція в OpenGL і DirectX може працювати дещо по-різному, і в різних умовах можуть отрисовываться різні картинки. Що ж залишається? Залишається працювати методом проб і помилок, тобто запускати сучасні ігри, які користуються функціональністю DirectX 10, і працювати над помилками.

Наша боротьба з Overwatch

Перевірити нашу підтримку DirectX 10 ми вирішили на прикладі гри Overwatch — багатокористувацької «стрілялки», випущеної компанією Blizzard Entertainment для всіх основних ігрових платформ, тобто для PC, PS4 і Xbox One — але не для Mac. Гра Overwatch користується можливостями DirectX 10 дуже інтенсивно, тому вона виявилася хорошим тестом на міцність для нашого DX10-драйвера. І гра заробила — але з безліччю проблем. Багато речей отрисовывались неправильно, повільно. Ось як виглядала гра спочатку.



Нижче ми опишемо лише три проблеми з тих, з якими нам довелося зіткнутися.

Елементи управління і пункти меню

Перше, що впало нам в очі — на відеокартах NVidia і Intel гра Overwatch не отрисовывала частина пунктів меню, індикаторів та значків. Проблему ми знайшли досить швидко — вона виявилася пов'язана з розходженням у трактуванні значень вбудованої змінної VertexID в вершинні шейдери. У разі індексного відтворення в DirectX ця змінна дорівнює значенню індексу вершини», а в разі роботи через OpenGL до нього додається ще значення BaseVertex. Шейдери, генеруючі текстуру, яка потім використовується для відображення меню та інших «плоских» елементів гри, використовують у своєму коді порівняння VertexID з передбаченими значеннями. Оскільки драйвери для NVidia і Intel працюють згідно специфікації OpenGL, вони видають неправильну картинку. Драйвери для AMD, навпаки, не додають BaseVertex до VertexID, в результаті помилка накладається на помилку і виходить правильний результат.
Можна було б легко виправити ситуацію з допомогою розширення GL_ARB_shader_draw_parameters (http://www.opengl.org/registry/specs/ARB/shader_draw_parameters.txt), але, на жаль, Mac його не підтримує — у всякому разі, поки. Ми знайшли інше рішення — коли використовуються відеокарти NVidia і Intel, ми передаємо значення BaseVertex всередину шейдера, і потім віднімаємо його з gl_VertexId. У підсумку виходить значення змінної, коректне з точки зору DirectX 10 числа. На відеокарти від AMD цього, природно, не відбувається.

Проблема з тінями

Насправді тіні об'єктів малювалися в Overwatch правильно. Зате на всіх освітлених ділянках були помітні смужки.



Після того, як ми детально розібралися з шейдерами, причина виявилася в налаштуванні стану OpenGL. Функція RasterizerState компонента Direct3D 10 Runtime має три значення, які визначають коригування глибини полігонів: DepthBias, DepthBiasClamp і SlopeScaledDepthBias. Їх аналог в OpenGL зводиться до виклику glPolygonOffset з правильними параметрами, і наша помилка полягала в тому, що при нульовому значенні DepthBias ми не припускали, що SlopeScaledDepthBias може бути не дорівнює нулю, оскільки вважали, що коригування глибини полігонів в цьому випадку виключена.

Чому випадають волосся

Той факт, що всі персонажі гри Overwatch під Parallels Desktop або повністю втратили свої шевелюри, або постриглися «під їжачок», викликав бурхливу реакцію в соціальних мережах і породив багато жартів.



Проте варто зауважити, що «відтягуючись» на полысевших героїв, добродушно налаштовані користувачі не помітили, що в грі відсутні не тільки волосся персонажів, але і деякі інші об'єкти. Тестування показало, що причина цієї екзотичної помилки — в нестачі вільних текстурних каналів. В OpenGL їх може бути не більше 16 на кожен тип шейдера. Це обмеження було пов'язано з тим, що використання текстурних каналів з номерами 16 і вище на відеокартах AMD призводить до псування стану OpenGL драйвер і проблем в наступних отрисовках. В результаті замість всіх інших текстур, що беруть участь у відображенні, шейдер отримував чорний колір, що в ряді випадків призводило до повного зникнення рисуемого об'єкта зі сцени. Треба сказати, що від самої проблеми ми, звичайно, не позбулися, але оскільки в Overwatch негативний ефект від зняття цього обмеження виявився мінімальним, ми вирішили для даного випадку від нього позбавитися. Варто відзначити, що в загальному випадку проблема дефіциту текстурних каналів в OpenGL порівняно з DirectX 10 стоїть гостро, оскільки останній теоретично дозволяє використовувати до 128 ресурсів в одній візуалізації, і рятує тільки те, що застосунків, які користуються такою можливістю, досить мало.

Результат

Вся робота зайняла у нас менше місяця, і виправивши помилки — як описані, так і ряд інших — ми домоглися того, що тепер наші користувачі дійсно можуть грати в Overwatch під Parallels Desktop для Mac, і ця гра працює в умовах віртуалізації досить швидко. Ця швидкість, звичайно, не порівнянна зі швидкістю роботи Overwatch на РС, і в разі серйозних навантажень гра гальмує. Але мета «наздогнати і перегнати PC» нами не ставилося. На прикладі Overwatch ми знайшли проблеми в роботі нашого віртуального драйвера і змогли їх виправити. Отримані результати допоможуть у підтримці роботі інших 3D-додатків. І, звичайно, ніщо не зрівняється з позитивним зворотним зв'язком від користувачів Mac — адже тепер завдяки нам вони можуть грати на цій платформі в свої старі улюблені ігри, перенесенням яких на Mac вже ніхто і ніколи б не здивувався.



Коли ж з'явиться підтримка DirectX 11

Справа в тому, що OpenGL на повне mac ' ах розвивається повільно і завжди помітно відстає від останніх актуальних версій. Навіть для підтримки DirectX 10 нам часто не вистачало наявної функціональності OpenGL на Mac, доводилося вдаватися до різного роду хитрощів і емулювати відсутні можливості самостійно. Зараз Mac підтримує OpenGL 4.1 і цього якось вистачає для DirectX 10, але для 11-ої версії бракує низки ключових можливостей, наприклад, compute-шейдерів. Так що, багато що залежить від того, чи буде Apple далі розвивати OpenGL на своїх машинах.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.