Поза межами ігор AAA


21

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

Це може бути описано як подібний до сліду Windows, який Windows XP може залишити за перетягуванням вікна, поки висить система.

Я можу лише постулювати, що розробники не очищають колірний буфер під час оновлення екрана?

Це правильно? Якщо так, то чому?


8
До речі, це часто називають ефектом "Зал дзеркал" або HOM.
Натан Рід

Відповіді:


35

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

Через це розробники ігор виявили, що було б ефективніше просто припустити, що кожен піксель буде повторюватися заново. Вони розробили багато методик для цього.

Колірний буфер найпростіше ігнорувати. Менш легкий буфер глибини, тому що він буде забруднений старими даними. Тож те, що вони зробили, було простим.

На кадрі 0, вони будуть надавати з glDepthRange(або D3D еквівалент) (0, 0,5), і вони будуть використовувати glDepthFuncз GL_LESS(або GL_LEQUAL). Це означає, що найменше значення глибини, яке ви коли-небудь отримали в буфері глибини, становить 0,5. Отже, найбільше значення в буфері глибини в кінці кадру 0 дорівнює 0,5 (якщо припустити, що ви писали до кожного пікселя).

На кадрі 1 вони змінили б діапазон глибини на (1, 0,5). Зауважте, що в цьому випадку значення близької глибини більше, ніж далека глибина. Але вони також змінять функцію глибини на GL_GREATER(або GL_GEQUAL), що змінює значення тесту на глибину. Оскільки найбільше значення в буфері глибини становить 0,5, все ви пишете матиме значення більше , ніж це. Оскільки тест на глибину був зворотним, це фактично означає, що все, що було написано на кадрі 0, тепер далече, ніж усе, що могло бути записано на кадрі 1. Наприкінці кадру 1 найменше значення в буфері глибини зараз становить 0,5.

А потім повторюють.

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

В основному, те, що відбувається - очищення буферів насправді нічого не пише. Вони зберігають деякі біти в кешах графічного процесора, які дозволяють системі знати, якого кольору / глибини вони очищені. Коли система намагається записати в кеш-рядок framebuffer, вона не турбується читати, що там є, тому що вона вже знає, що це порожнє поле чіткого значення кольору / глибини. Якщо ви спробуєте поєднатись з тим, що там, або зробите глибинний тест, знову ж таки, не потрібно читати: він знає, яке значення для суміші / тесту з / проти.

Таким чином, кожне перше читання / зміна / запис, яке ви робите в кожному рядку кешу після чіткого, - це в основному запис. Це безкоштовно .

Крім того, наявність нерівного буфера глибини може працювати проти Hyper-Z / Hierarchial-Z / будь-яких оптимізацій Z-culling в апаратному забезпеченні. Так, ваша сцена буде працювати проти тих, з часом, коли ви додасте деталі. Але якщо ваш глибинний буфер зазубрив попередні візуалізації, навіть якщо ці фонові об’єкти знаходяться у фоновому режимі, це може вплинути на ефективність методів Z-купірування. І це не допоможе виступі.

Тож ніколи не слід застосовувати цю техніку повернення глибини в сучасних іграх.

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


Чи означає ваше останнє твердження, що ніколи не змінювати буфер глибини чергування або? Чудова відповідь.
deceleratedcaviar

1
@Daniel Так. Я уточнив свою посаду.
Нікол Болас

3
Крім того, пропуск прозорості для архівів бінінгу (як і більшість чіпів OpenGL ES) призводить до значних втрат продуктивності, оскільки графічний чіп не може робити припущення щодо стану кольорового буфера.
Jari Komppa

5

Так, ви праві, що задній буфер не очищається.

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

Таким чином, за нульової вартості ви економите один буфер очищення на кадр.


1
Я не знаю про глибоку пінг-орієнтацію; кожен знайомий мені двигун очищає буфер глибини / трафарету кожного кадру. Але крім цього, так, якщо гра надає всі пікселі (як слід), вам не потрібно очищати кольоровий буфер.
Натан Рід

Чи можете ви навести приклад для шейдера, добре відповідь інакше.
deceleratedcaviar

1
Я розумію, що ви запитуєте про останні двигуни, читаючи коментар @ NathanReed про те, скільки двигунів лише для ПК працює зараз. Скручування буфера Z - це більш стара техніка, я побачу, чи зможу знайти посилання. Двигуни консолей здебільшого очищатимуть також всі кольорові буфери, навіть один піксель, що показує ефект HOM, названий Натаном, не зможе назву і змусить її знову повторювати подання.
Патрік Хьюз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.