Advanced: Тема повышенной сложности или важная.
san
> Я не понял, у тебя какой хедсет?
Oculus Quest 2 через Oculus Link.
> как ты инициализировал OpenVR на Линуксе?
Пока никак, потому что Oculus Link в линуксе не поддерживается, но сама библиотека openvr для линукса есть, см. https://github.com/ValveSoftware/openvr
Поэтому разработку под VR буду вести преимущественно в винде.
> Сначала строится картинка для левого глаза, потом для правого.
Если решать задачу "в лоб", то да. А средствами GL_OVR_multiview (у DX12 должен быть аналог) можно делать вывод сразу в два фреймбуфера. Один DrawCall, один "двойной" проход вершинного шейдера (ему передаётся параметр gl_ViewID_OVR, 0 для левого глаза и 1 для правого, чтобы выбрать нужную матрицу). Фрагментные шейдеры уже выполняются каждый для своего фреймбуфера.
romanshuvalov
Думаю тут экономия копеечная. Вертексы и так быстро обрабатываются, тормозит все же пиксельный уровень.
Сцена у меня довольно сложная, с зеркалами, стеклянной посудой и кучей блестящих поверхностей. Но без суперсемплинга успеваю даже на 970.
Вот картинка:
san
> Думаю тут экономия копеечная. Вертексы и так быстро обрабатываются
Я тоже так думаю, но когда начну внедрять виар - обязательно сделаю мультивью и проверю на одной и той же сцене.
romanshuvalov
Так у тебя пример запустился? Если есть проблемы то я через полчаса буду за компом, могу что-то прислать из кода. Только я не очень понял как ты запускаешь Квест из среды SteamVR.
Хелло Ворлд успешно завёлся. Переписал под C API с динамической подгрузкой, компилировал в привычном для себя mingw, VS не трогал. /A\, спасибо за пример работы с C API. Кстати, у тебя в OpenVRDevice.cpp на 138-й строчке ошибочно дважды выводится одно и то же.
san
> Так у тебя пример запустился?
Да, вот буквально только что. Спасибо за помощь.
> я не очень понял как ты запускаешь Квест из среды SteamVR.
"Я ничего не трогал, оно само". Можно просто запустить приложение, оно само запустит SteamVR, а SteamVR запустит Oculus Link и откроет в нём себя, а в нём - моё приложение. Только в шлеме надо будет подтвердить подключение по Oculus Link.
Нигде не могу найти полную спецификацию файлов json от SteamVR Input (действия и биндинги). В частности, список возможных источников и названия их выходных параметров.
В примере есть analoginput от трекпада. Догадался сменить на joystick, сработало. А вот триггер не сработал, потому что у него действие не "position", а "pull", о чём я узнал случайно, сделав поиск по "json" в папке стима и изучая всё подряд в качестве примеров.
В вики гитхаба есть только описание манифеста действий:
- https://github.com/ValveSoftware/openvr/wiki/Action-manifest
Но ничего не сказано про биндинги, нет описания источников (sources) и их выходных параметров (position для трекпада, pull для триггера, и я не знаю, что ещё бывает).
В документации Steam Input (не VR) есть что-то, благодаря чему можно угадать правильные значения, но это всё равно непорядок, тем более документация о другом, а источника "touchpad" из примера вообще нет. См. раздел EInputActionOrigin и ниже:
- https://partner.steamgames.com/doc/api/isteaminput
Кто-нибудь решал данный вопрос?
romanshuvalov
Я решал. Описания действительно нет. Каждый новый контроллер приходится настраивать индивидуально, иногда одинаковые управляющие элементы (например джойстик) называются по разному. Советую посмотреть файлы к Alyx, там есть настройки для всех имеющихся девайсов. А далее делай по аналогии.
Если хочешь по быстрому настроить свой контроллер - могу помочь. Скажи только какой у тебя девайс.
san
> Советую посмотреть файлы к Alyx
Alyx отсутствует в связи с отсутствием ПК, который её потянул бы. Но я уже нашел то же самое в
> Скажи только какой у тебя девайс.
Контроллеры Oculus Touch от Oculus Quest 2. Но я всё прописываю для generic, дублируя trackpad и joystick.
В ближайшие дни залью демку в Steam, дам ссылку. Если у тебя другие контроллеры - было бы интересно узнать, заведётся ли всё из коробки.
romanshuvalov
У меня Рифт, Индекс, Реверб и где-то валяется старый WMR от Acer. Но что бы сказать будет ли твой код работать на этом железе мне достаточно посмотреть на Джейсон настройки. Для них я все установки знаю. Единственно что у меня нет так это Vive.
>Но я всё прописываю для generic, дублируя trackpad и joystick.
Это не будет работать. Смотри выше.
Ну если Alyx нет, то я сейчас погуляю с собакой и выложу тебе свои настройки. Там я все знаю и все основные функции проверены. Есть еще настройки (типа гистерезиса у джойстика) с которыми я не разбирался, но я их и не использую.
san
> Это не будет работать. Смотри выше.
Вообще-то работает:
romanshuvalov
> Вообще-то работает:
Это работает для одного контроллера, на котором ты это настроил и отладил. На другом, с отличающимися настройками (другими названиями для действий), это работать не будет. Почему там разные названия - это мне неведомо. Но это медицинский факт. Поэтому делают разные настройки для разных контроллеров, а не один общий для всех.
ОК, вот тебе мои настройки: OPenVR setting
Посмотри, если что непонятно - спрашивай.
san
> ОК, вот тебе мои настройки: OPenVR setting
Посмотрел и что-то не увидел никакой разницы в названиях. Вижу только, что, например, у Oculus Touch отсутствует биндинг трекпада, которого у него нет. Но в Vive Cosmos прописан и трекпад, и джойстик. И данный конфиг от Vive Cosmos прекрасно должен сработать и для Oculus Touch (просто окулус проигнорирует секцию с трекпадом). Можешь сам в этом убедиться, надев Рифт с Тачами и принудительно загрузив конфиг от vive cosmos.
Особые настройки вроде "deadzone_pct": "35" сейчас не рассматриваю.
romanshuvalov
Не, ну я же не настаиваю, делай как тебе хочется.
Но только задумайся, почему все другие разработчики на OpenVR не идут по такому простому пути - заделать один файл для всех контроллеров и все дела. Тупые, никто не догадался? Уверен?
>Можешь сам в этом убедиться, надев Рифт с Тачами и принудительно загрузив конфиг от vive cosmos.
Я уже писал, что Vive у меня нет, потому файл делал по аналогии. Но Индекс с Рифтом несовместим. То же самое с WMR - там вообще джойстик не работал. Ну и все такое. Но делай как знаешь.
san
> Но Индекс с Рифтом несовместим.
Вот, я попытался вслепую сделать универсальный конфиг, совместимый как минимум и с индексом, и с рифтом. Можешь проверить? Это конфиг для твоей игры. Я не уверен, сработает ли, но подозреваю, что да.