TL; DR: Мы получили иммерсивную PS1, работающую в Javascript + WebXR + WebAssembly с Exokit. Еще игры для N64VR. Видео и код в конце сообщения.

Итак ... с Emukit 2 ... PlayStation 1 VR - это вещь

В обновлении Emukit 2 есть множество улучшений производительности и совместимости N64 VR, так что гораздо больше ваших любимых игр работают в смешанной реальности:

Совершенная тьма 64 VR

Звездная лиса 64 VR

В этом посте рассказывается, как и почему я и команда разработчиков Exokit переносим вчерашние игры на веб-смешанную реальность. Но ... если вам нужен только код или видео, они находятся в конце сообщения.

Почему Эмукит?

Суть Exokit («постэкранный веб-браузер») заключается в написании веб-браузера смешанной реальности на Javascript.

Мы хотим внедрить лучший в мире язык / фреймворк - Javascript - в будущее, где не будет 2D-экранов.

Через 10 лет

Если мы на секунду приостановим недоверие, представьте себе мир, в котором каждый разработчик использует свой любимый язык для кодирования своего приложения. Надеюсь, это Javascript, но, может быть, это не так - в этом случае она использует WebAssembly.

Ее код автоматически запускается на любом устройстве VR, AR или нейроимпланте.

Я понятия не имею, как будут развиваться технологии, поэтому Exokit не делает никаких ставок. Exokit написан на Javascript и интегрируется с любым API смешанной реальности, который вам нужен:

  • Волшебный прыжок
  • OpenVR (Steam VR)
  • Oculus VR
  • Прыжок Движение Орион
  • Рабочий стол
  • ARKit + ARCore (в будущем)

Эмулятор для Интернета

Какая программа объединяет все воедино? Безусловно, потребуется много эмуляции.

Часть программного обеспечения, склеивающая все это с Javascript, должна будет принимать данные из разных API:

  • снаружи-в VR (датчики стреляют в устройство)
  • наизнанку AR (устройство снимает мир)
  • Magic Leap / AR SLAM (локализация в пространстве без предварительной информации)
  • Машинное обучение с обнаружением рук Leap Motion (вычисление геометрии предмета из растрового изображения)
  • и многое другое

Этот уровень Javascript также должен работать другим способом и преобразовывать объекты JS, прежде чем передавать их на оборудование. Например:

  • возьмите ArrayBuffer и отправьте его на графический процессор
  • сопоставить ‹canvas› с установленным на кучах дисплеем
  • согласовать и настроить HMD
  • объединить несколько сайтов / приложений в одну когерентную реальность
  • координировать идеальное время кадра с помощью requestAnimationFrame
  • имитировать входные события для тестирования / бота
  • сеть и мультиплеер
  • и снова многое другое

И этот средний уровень должен заключать все в общий API (WebXR), который приложения могут использовать для создания уровня реальности и представления его пользователю.

Если это больше похоже на эмулятор, чем на браузер, я вас не виню. Мы называем это браузером, но на самом деле Exokit - это 3D-эмулятор для Интернета.

Когда я запустил Emukit (эмулятор консоли смешанной реальности, работающий на Exokit), это был всего лишь еще один шаг к тому, чтобы взять все и превратить это в смешанную веб-реальность.

Кроме того, я плохо разбираюсь в играх. Может быть, я немного хуже вставляю множество классных игр, которые определяли мое детство, в матрицу (THREE.Matrix4).

Как я сделал PS1 VR

Заставить PlayStation (одну, а не четыре!) работать в виртуальной реальности было непросто. Не в последнюю очередь то, что PlayStation на самом деле представляет собой 2D-машину.

Да, PlayStation - это 2D-машина.

Вероятно, вы могли бы найти место в прямых трансляциях Twitch, где, потратив пару недель на решение проблемы, я, наконец, открыл документацию и понял, что то, что я делаю, может быть невозможно. Ой!

Очевидно, мы сломали невозможный орешек.

Пройдите со мной по улице истории и проспекту графики.

На рубеже размеров

Как я уже сказал, графический процессор Playstation на самом деле полностью 2D. Он может рисовать красивые многоугольники, градиенты, затенение по Гуро и даже дрянные текстуры с целочисленным выравниванием. Но… он делает все это по осям X и Y. Графический процессор PlayStation буквально представляет собой всего лишь мегабайт 2D-пикселей и ничего больше.

Вот почему вы слышите, что у PSX не было Z-буфера. N64 сделал это, и он намного ближе к тому, что мы думаем о 3D-графике сегодня.

Но PSX одной ногой придерживался SNES, а другой - Xbox. Он не мог решить, что это было, поэтому было и то, и другое.

Так как же мы получили «3D-графику» на PSX и какое волшебство движет Emukit? Ответ - эпическая хитрость: Geometry Transform Engine или GTE.

Поскольку мы установили, что графический процессор PSX не выполняет трехмерную математику, GTE был сопроцессором PSX, который выполнял эту работу. Он ничего не мог рисовать, но он мог выполнять трехмерные векторные и матричные вычисления намного быстрее - и параллельно с - процессором PSX.

Кстати, процессор PSX действительно отстой - он был на треть быстрее, чем у N64, примерно на 33 МГц.

PGXP ваш PSX для WASM WebXR в HMD

К счастью, проблема добавления третьего измерения в стек графики PlayStation не нова. У PSX отстой в передаче перспективы и наложения текстур - старый мем. Это означает, что хакеры более умные, чем я, уже взломали.

Решением является метод PGXP, или конвейер параллельного преобразования геометрии. По сути, это добавляет еще один уровень хака к эпическому хаку, которым является GTE.

Итак, представьте, что мы игра для PlayStation. Мы загружаем нашу геометрию с компакт-диска (время мучительной загрузки включено бесплатно). Мы отправляем нашу геометрию vec3 в GTE для преобразования в матрицу модели / вида / проекции камеры. Мы возвращаем 2D-точки, которые отправляем в виде команд нашему поврежденному 2D-графическому процессору.

Вы видите, как получить из этого 3D-рендеринг?

Правильно: мы добавляем дополнительный кеш для данных вершин, поступающих в GTE.

Когда GTE принимает точку, мы не просто выводим 2D-результат для графического процессора; мы также кэшируем 3D-вершины, которые мы использовали, на основе координаты X / Y вывода.

С помощью этого мутировавшего монстра кеша, которого не было на реальной PlayStation, мы можем протянуть руку от графического процессора, чтобы взглянуть на исходные 3D-вершины, когда пришло время рисовать. И точно так же мы можем своего рода преобразовать 2D-графический процессор в «настоящий современный графический процессор», взяв эти трехмерные данные и отправив их в конвейер вершинного / фрагментного шейдера.

Как только я получил 3D-точки, поступающие в графический процессор, было довольно просто добавить стандартные хаки MR-ификации из реализации Emukit N64VR.

То есть мы используем тот факт, что Exokit - это просто Javascript, чтобы перехватывать вызовы отрисовки GL и удваивать их, используя две разные матрицы глаз и окна просмотра, поступающие из WebXR.

Буквально переписывая OpenGL

С Emukit 2 у меня ушло не так много времени, потому что для того, чтобы все заработало, нужно было трижды переписать графический процессор Playstation и один раз OpenGL.

Во-первых, урок WebGL.

WebGL - это просто привязка Javscript для OpenGL (ES). Фактически, именно так Exokit реализует это буквально.

А WebGL2 очень близок к полноценному OpenGL, который используют большинство приложений, включая игры. Основные упущения - это то, что было бы грубо для Javascript, например, буферы с отображением памяти.

Это означает, что вы можете использовать Emscripten для компиляции 3D-приложений в WebAssembly + WebGLL2 + Javascript, и это часто просто работает. В этом суть VRify N64, а теперь и PSX,

Я наткнулся на две неровности: эмуляторы и Exokit указывали в противоположных направлениях истории:

  • Эмуляторы PlayStation использовали устаревший OpenGL, такой же старый, как PlayStation.
  • Exokit не поддерживает новые конечные точки WebGL2, используемые Emscripten.

Чтобы исправить первое, я переписал устаревшую реализацию OpenGL, чтобы использовать современные матрицы, шейдер, буфер и конвейер отрисовки. Спасибо Зевсу (богу) за Хроноса (консорциум)!

Плагины Playstation OpenGL часто жалуются на то, что они устарели, поэтому я постараюсь улучшить эту работу, если это можно сделать легко.

Чтобы решить последнюю проблему, заключающуюся в том, что Exokit не поддерживает API-интерфейсы WebGL2, которые использовал Emscripten, я просто на день взломал MDN (поддержка Mozilla для борьбы с хорошей борьбой за документирование веб-API!). И это я реализовал WebGL2 в Exokit. Это было совсем несложно, поскольку Exokit написан на Javascript.

Отличительной особенностью новых API-интерфейсов WebGL2 является то, что они «не содержат мусора», что означает, что они принимают дополнительные аргументы смещения, поэтому вам не нужно создавать новые представления типизированных массивов при вызове WebGL.

Поскольку вызов WebGL, скорее всего, является горячей точкой вашего кода смешанной реальности Javascript со скоростью 90 кадров в секунду, это означает, что использование API-интерфейсов WebGL2 может значительно снизить нагрузку на сборщик мусора.

Именно поэтому Emscripten хочет использовать эти новые API, и поэтому я благодарен за трассировки стека, которые он мне бросил. Теперь, когда у нас есть WebGL2 в Exokit, выигрывают все. И Emukit стал немного быстрее даже для N64VR.

Говоря о…

Назад в прошлое, чтобы вернуть прошлое в будущее

Что касается Emukit 2, я хотел бы немного поблагодарить всех, кто поддерживал проект. Это означало, что некоторые из любимых фанатов N64 загружались и работали в Emukit быстрее.

С этой целью я переписал ядро ​​N64VR, чтобы использовать новый унифицированный конвейер MRification, который я написал для PSXVR. Если вы помните из предыдущего поста, мы ранее перехватывали вызовы GL, шейдеры и матрицы, выходящие из эмулятора, но сам эмулятор был в основном стандартным от RetroArch, унаследовав его проблемы совместимости.

Итак, я обновил и перекомпилировал эмулятор N64 из исходных кодов, внося в него некоторые исправления для сопроцессора, которые мешали загрузке более сложных игр.

В частности, в дополнение к любимым играм, таким как OOT / Majora и Star Fox 64, теперь работает Perfect Dark. Многопользовательский / боевой симулятор!

Я также добавил матричный конвейер Модель-Вид-Проекция в сам эмулятор и встроил код развёртывания перспективы в шейдер, чтобы он работал на графическом процессоре. Это означает, что все должно работать более плавно с меньшим количеством генерации мусора Javascript.

Некоторые игры, которые я тестировал:

Nintendo 64

  • Супер Марио 64
  • Звездный лис 64
  • Perfect Dark
  • окарина времени
  • Маска Маджоры

Игровая приставка

  • Metal Gear Solid
  • Краш Бандикут
  • Последняя фантазия 7
  • Спайро Дракон

Удивительно, но мне не пришлось менять матрицы ни для одного из них. Здесь используются константы масштабирования, которые мы установили с помощью Ocarina of Time, и все это просто работает.

Я также обновил элементы управления N64VR, чтобы они лучше работали в играх, в которых используется полный трезубец N64, особенно в шутерах.

Что дальше?

Благодаря иммерсивным PlayStation и Nintendo 64 на JavaScript мы можем многое сделать!

Emukit - это наш способ изучения того, что мы можем сделать с движком веб-браузера смешанной реальности, написанным на JavaScript.

Некоторые идеи, которые мы слышали:

  • Добавьте многопользовательский уровень с WebSockets, WebRTC или придумайте что-нибудь получше, например WebUDP
  • Встроенная интеграция с Unity и другими движками
  • Компонентируйте Emukit в объектно-компонентную систему, такую ​​как A-Frame
  • Запускайте игры Emukit как иммерсивные порталы AR в Magic Leap One
  • Взломайте ПЗУ с помощью JS, чтобы интегрировать новые схемы управления, такие как Leap Motion

Некоторые из вышеперечисленных могут или не могут быть в процессе. Надеюсь скоро поделиться. ;)

Покажи мне VR

Я сделал видео-пошаговое руководство по Emukit 2, в том числе о том, как начать работу. Тоже про hax.

Покажи мне код

И Exokit (движок браузера), и Emukit (сайт эмулятора) имеют открытый исходный код на Github.

Посетите Exokit: https://exokit.org

Подпишитесь на нашу рассылку для получения обновлений: http://eepurl.com/dFiLMz

Домашняя страница: https://exokit.org
GitHub: https://github.com/exokitXR/exokit
Twitter: https://twitter.com/exokitXR спер
Instagram: «https://instagram.com/exokitXR

Discord: https://discord.gg/cf5tfTV
Slack: https://exokit.slack.com/join/ shared_invite / enQtNDI3NjcxNzYwMDIxLWU2NmFmOTEzMzk4NWNiYjRhMjVkYzcyNjg5YjUyMzZkYWM1ZGI4M2IwYWZiMjNlMTJjMexwm2U.ua