Що таке "Scanline Racing"


13

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

Відповіді:


14

Коли ваш GPU відображає новий кадр на екрані, він передає зображення по кабелю HDMI (або будь-якому іншому) в процесі, який називається "сканування". Пікселі надсилаються в лінійному порядку, як правило, зліва направо і зверху вниз. Процес приурочений таким чином, що для цього потрібна більша частина тривалості інтервалу оновлення. Наприклад, при 60 Гц один кадр становить ~ 17 мс. Кожен сканування займає, ймовірно, близько 15-16 мс, з 1-2 мс vblank між ними (точні значення залежать від режиму відображення та відео).

Традиційно візуалізація має подвійний буфер, що означає, що в пам'яті GPU зберігаються два буфери: один, який в даний час сканується ("передній буфер"), і той, який надається ("задній буфер"). Кожен кадр, два поміняються місцями. Графічний процесор ніколи не надає той самий буфер, який сканується, що запобігає артефактам через те, що потенційно можна побачити частини неповного кадру. Однак побічним ефектом цього є збільшення затримки, оскільки кожен кадр може сидіти в буфері протягом декількох мс, перш ніж він почне скануватись.

VR дуже чутливий до затримки, тому це не бажано. Альтернативним підходом є візуалізація безпосередньо до переднього буфера, але викладіть час дуже обережно, щоб ви вивели кожен рядок зображення незадовго до того, як сканування потрапить туди. Це називається "скандинавські перегони" або "перегони променями" ("промінь", що повертається до днів ЕПТ). Це більш-менш вимагає відтворення зображення в порядку сканування, тобто в тому ж порядку, в якому пікселі будуть відскановані. Він буквально не повинен бути виведений по одному рядку за один раз - він може бути виведений тонкими смужками у висоту декількох пікселів, але це потрібно робити в порядку, оскільки ви не можете повернутися назад і редагувати пікселі, які вже були відскановано.

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


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

1
@Mokosha Правильно, немає можливості запитувати сканування безпосередньо AFAIK. У кращому випадку ви можете зрозуміти, коли знаходиться vsync (через деякий сигнал ОС), і оцінити, де знаходиться сканування за часом, що відповідає цьому (знаючи деталі режиму відео). Що стосується візуалізації, ви можете експериментувати, щоб дізнатись, скільки часу триває між glFlush та коли рендерінг завершено, і зробити деякі здогадки на основі цього. Зрештою, вам доведеться створити деяку слабкість у часі у випадку помилки (наприклад, залишитися на 2-3 мс перед початком сканування), і прийняти, що, ймовірно, будуть випадкові артефакти.
Натан Рід

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

Я придумав точний спосіб передбачити растри без запиту рядка сканування, відповідь див. Нижче.
Марк Реджон

0

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

https://www.youtube.com/watch?v=OZ7Loh830Ec

Я придумав точні мікросекундні точні формули як зміщення VSYNC, щоб передбачити положення слізної лінії. Стрічкові лінії під час VSYNC OFF завжди точні за растром, тому ви можете виключати їх із видимості під час рівня "смуги" модельованого переднього буфера на рівні смуги шляхом повторної заміни буфера VSYNC OFF.

Зверніть увагу на тему форуму - постійно додається код з відкритим кодом - https://forums.blurbusters.com/viewtopic.php?f=10&p=32002


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.