niedziela, 1 grudnia 2019

FreeCAD OpenVR - obsługa gogli wirtualnej rzeczywistości.

Program FreeCAD można było do tej pory skompilować z obsługą okularów wirtualnej rzeczywistości Oculus Rift. To jednak wykluczało z użytkowników innych gogli i systemów operacyjnych. Implementacja nie wykorzystywała też kontrolerów ruchowych. Dlatego postanowiłem dodać do programu obsługę OpenVR. Na początek małe demo (okno podglądu przedstawia widok lewego oka):

Dzięki OpenVR możliwa jest obsługa gogli m.in.:
  • Oculus Rift
  • HTC Vive
  • Valve Index
  • okularów standardu Windows Mixed Reality, np. Samsung Odyssey
OpenVR działa na systemach operacyjnych:
  • Windows
  • Linux
  • macOS
OpenVR zapewnia również obsługę kontrolerów ruchowych.

Implementacja OpenVR w programie FreeCAD

Implementacja zapewnia obsługę trybu pokoju oraz dodatkowego ruchu z wykorzystaniem kontrolerów.
Binarną wersję programu dla Windows można pobrać z github.com/kwahoo2/FreeCAD/releases/tag/0.19_preVR-1
A następnie uruchomić FreeCAD.exe z katalogu bin.  Wydanie dla Linuksa w postaci AppImage planuję wykonać później. można pobrać z tego samego miejsca.

Kod źródłowy można znaleźć tutaj github.com/kwahoo2/FreeCAD
Nie ma w nim odwołań specyficznych dla systemu operacyjnego, stąd można go skompilować zarówno na Linuksie jak i Windows. Wątek na forum programu FreeCAD.

Wymagania do kompilacji z źródeł:
  1. Standardowe wymagania dla kompilacji FreeCADa: Linux, Windows,
  2. OpenVR SDK github.com/ValveSoftware/openvr,
  3. Opcja cmake BUILD_OPENVR ustawiona (np. z użyciem cmake-gui) na ON (podczas wywołania w trybie tekstowym -DBUILD_OPENVR=ON),
  4. Opcja BUILD_QT5 ustawiona na ON - implementacja korzysta z QOpenGLWidget wprowadzonego w Qt 5.4,
  5. Może być konieczne określenie katalogu plików nagłówkowych z użyciem opcji OpenVR_INCLUDE_DIR - dla Linuksa będzie to np. /usr/local/include/openvr a dla Windows C:\Program Files (x86)\OpenVRSDK\include,
  6. Może być konieczne określenie pliku biblioteki OpenVR - na Linuksie np. /usr/local/lib/libopenvr_api.a, na Windows lokalizacja_pobranego_sdk\lib\win64\openvr_api.lib,
  7. Dodatkowo w przypadku Windows do katalogu z FreeCADem, obok FreeCAD.exe trzeba skopiować plik openvr_api.dll, który można znaleźć w katalogu openvr\bin\win64,
  8. Ważne żeby na Windows ustalić kompilator w cmake na 64-bitowy, domyślnie konfiguracja jest dokonywana dla 32-bitowego, nawet gdy system jest 64-bitowy. Kompilacja dla 32-bitów spowoduje błąd konsolidatora, bo biblioteki FreeCADLibs są obecnie udostępniane wyłącznie w wersji 64-bitowej. 

Wymagania do uruchomienia:
  1. Należy podłączyć gogle, uruchomić Steam i SteamVR,
  2. Uruchomić FreeCAD, otworzyć wybrany model i wybrać z menu View pozycję FreeCAD-OpenVR,
  3. Gdy tylko SteamVR wykryje aktywność okularów, powinno pojawić się okna podglądu i obraz w samych goglach,
  4. Chcąc obejrzeć inny model/plik trzeba ponownie wybrać FreeCAD-OpenVR (kończy to rendering VR) i po otwarciu nowego modelu jeszcze raz użyć FreeCAD-OpenVR.
Teoretycznie program powinien dać się skompilować również pod macOS, ale niestety nie miałem możliwości tego sprawdzić.

Nawigacja:

Implementacja obsługuje tryb pokoju, czyli można swobodnie poruszać się w obszarze modelu. Dodatkowo można wykorzystać kontrolery do nawigacji:
  1. Gałka analogowa lub gładzik pierwszego kontrolera pozwala przesuwać się liniowo - poruszamy się wzdłuż kierunku wskazywanego przez kontroler,
  2. Gałka analogowa lub gładzik drugiego kontrolera pozwala obracać "świat" wokół dwóch osi, środkiem obrotu jest położenie kontrolera.

Przyszły rozwój

W najbliższym czasie chciałbym popracować nad wydajnością i jakością wyświetlania (wygładzanie krawędzi).

Prototyp w Pythonie

Dostępny jest też prototyp implementacji w Pythonie, który napisałem przez zabraniem się z pisanie kodu w C++. Można go pobrać stąd github.com/kwahoo2/freecad-pyopenvr i wystarczy skopiować do konsoli FreeCADa. Wymaga on Pythona wersji 3.5 lub nowszej, pyopenvr, numpy, pivy-coin i PySDL2. Prototyp nie obsługuje kontrolerów.


środa, 14 sierpnia 2019

Migotanie monitora 75Hz - łatanie kernela

Post ten opisuje sposób łatania jądra Linuksa na przykładzie łatki usuwającej błąd w sterowniku dla kart AMD Radeon (Polaris).
Błąd ten ujawnia się tylko w przypadku monitorów o  częstotliwości odświeżania 75 Hz (i prawdopodobnie wyższych). Na ekranie okresowo widoczny jest poziomy migoczący pasek. Problem znika po ustawieniu stałej częstotliwości pamięci karty graficznej lub całkowitym wyłączeniu zarządzania energią. To skuteczne obejście problemu, ale niestety niezbyt wygodne.

Pojawiła się łatka naprawiająca błąd - aby ją wykorzystać trzeba skompilować kernel.

Łatanie kernela (Ubuntu)

Zrobimy to na przykładzie jądra 5.3-rc4, które było najnowszym w chili pisania postu. Aktualne źródła można znaleźć na kernel.org.

Przygotowujemy środowisko do zbudowania jądra, instalując potrzebne pakiety:

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

Pobieramy źródła jądra i rozpakowujemy je:

wget https://git.kernel.org/torvalds/t/linux-5.3-rc4.tar.gz

tar xvzf linux-5.3-rc4.tar.gz

Pobieramy łatkę i zapisujemy ją jako 0001-drm-amd-powerplay-enforce-minimal-VBITimeout.patch

Dopiero teraz wchodzimy do rozpakowanego katalogu z jądrem: 

cd kernel/linux-5.3-rc4/

Aplikujemy łatkę:

patch -p1 < ../0001-drm-amd-powerplay-enforce-minimal-VBITimeout.patch 

Kopiujemy konfigurację jądra z naszej dystrybucji:

cp /boot/config-$(uname -r) .config

Konfigurujemy interesujące nas opcje ręcznie:

make menuconfig

Kompilujemy i instalujemy jądro oraz moduły (wartość po -j należy dostosować do liczby rdzeni procesora):

make -j16
sudo make modules_install
sudo make install

W tym miejscu okazuje się, że plik initrd jest bardzo duży. Musimy go zmniejszyć usuwając niepotrzebne symbole z modułów jądra:

cd /lib/modules/5.3.0-rc4/
sudo find . -name *.ko -exec strip --strip-unneeded {} +
sudo update-initramfs -c -k 5.3.0-rc4
sudo update-grub

Po tym wszystkim wystarczy zrestartotwać komputer i cieszyć się prawidłowo wyświetlanym obrazem.

poniedziałek, 12 sierpnia 2019

Wymuszanie uruchamiania windowsowej wersji gry na Steamie dla Linuksa (na przykładzie Black Mesy Xen beta update)

Porty niektórych gier na Linuksa są niskiej jakości/działają wolno lub wręcz nie działają w ogóle. W międzyczasie DXVK (translator Direct3D11-Vulkan) i D9VK (Direct3D9-Vulkan) stały się na tyle niezawodne i wydajne, że potrafią z powodzeniem z natywnymi "buildami" gier. W skrajnych wypadkach (np. Dying Light) gra uruchomiona przez DXVK potrafi być ponad dwa razy wydajniejsza niż port Linuksowy.

Jako przykład wybrałem betę Xen dla Black Mesy, bo nie działa ona na Linuksie w ogóle, oraz jest to gra korzystająca z DirectX9, przez co konfiguracja jest nieco bardziej skomplikowana.


Pierwszy krok to wybranie właściwości gry (prawy przycisk myszy na nazwie gry w liście gier):



Należy zaznaczyć opcję: "Wymuś użycie określonego narzędzia Steam Play" i wybrać najnowszą wersję Proton z listy rozwijanej. To sprawia, że gra będzie uruchamiana przez Proton i DXVK.  Dla gier korzystających z DirectX11 nie potrzeba robić nic więcej.
Black Mesa to jednak gra działająca w oparciu o D3D9 i potrzebuje D9VK, które jest zintegrowane z Protonem, ale nie zostało włączone domyślnie. Wybieramy "USTAW OPCJE URUCHAMIANIA..." i wpisujemy:

PROTON_USE_D9VK=1 %command% 

Oczywiście musimy też wybrać gałąź public-beta by mieć dostęp do bety Xen.


Teraz wystarczy zaakceptować ustawienia i poczekać na pobranie plików specyficznych dla Windows.

Valve ACO

Użytkownicy Radeonów mogą spróbować nowego kompilatora shaderów przygotowanego przez Valve. Obecnie współpracuje z implementacją Vulkan, wpływając zarówno na gry natywne jak i DXVK i D9VK. W zdecydowanej większości przypadków ACO skraca czas ładowania gier i zwiększa liczbę klatek na sekundę, a także redukuję "cięcie" spowodowane kompilacją shaderów.

Dla Ubuntu 19.04 instalacja wygląda następująco:

sudo add-apt-repository ppa:valve-experimental/mesa
sudo apt-get update
 
Uwaga, przed instalacją ACO należy usunąć inne "graficzne" PPA jak Padoka czy Oibaf jeśli takie były zainstalowane.

Po wpisaniu w opcje uruchamiania gry:

DXVK_HUD=1 PROTON_USE_D9VK=1 %command%

w lewym górnym rogu powinniśmy zobaczyć informację o użyciu ACO:


Nie działa?

Po pierwsze sprawdźmy czy są zainstalowane wszystkie potrzebne biblioteki:

sudo apt install libvulkan1 libvulkan1:i386 mesa-vulkan-drivers mesa-vulkan-drivers:i386

Jakie wydajności się spodziewać?

Bardzo bliskiej (czasami wręcz równej) wydajności Windows. Xen beta niestety działa niezbyt szybko, niezależnie od systemu operacyjnego. Uwidaczniają się tutaj ograniczenia Source.

Bonus

Kilka zrzutów ekranów gier uruchomionych z zmienną DXVK_HUD=full

Black Mesa (D9VK)

Hard Reset (D9VK)

Ride 2 (DXVK)

wtorek, 30 lipca 2019

Valve Index - pierwsze (i drugie) wrażenie



Chciałem podzielić się wrażeniami z użytkowania zestawu wirtualnej rzeczywistości Valve Index. Tego sprzętu jest jeszcze niewiele w Polsce, nie spotkałem też oryginalnych polskojęzycznych recenzji.

Mam pełny zestaw: gogle, kontrolery (aka Knuckles), stacje bazowe 2.0 (aka Lighthouse).

HMD (gogle)

Gogle są niemal doskonałe, pod jednym warunkiem: trzeba je odpowiednio założyć oraz poświęcić nieco czasu na ustawienie. Małe przesunięcie na twarzy powoduje utratę ostrości. Gdy jednak złapie się odpowiednie położenie to obraz jest ostry praktycznie w całym obszarze widzenie. Jego jakość wydaje się lepsza niż można by spodziewać się po suchych danych technicznych (1440x1600 pikseli na każde oko). W scenie z poniższego zrzutu (gra Budget Cuts), nie ma problemu by przeczytać cyfry na klawiaturze telefonu czy "THIS AREA IS" na plakacie w oddali:

Widoczny poniżej (gra Serious Sam: The Last Hope) mały napis na boku pistoletu jest idealnie ostry. Więcej, w goglach znacznie lepiej widać małe rysy pod napisem niż na zrzucie:


Efekt moskitiery (ang. screen door effect) czyli widzialnych przestrzeni między pikselami jest trudny do zauważenia. Powiedziałbym, że bardziej go widzę na 15-calowym ekranie notebooka 1366x768 niż w Valve Index.

Soczewki od strony twarzy  są praktycznie płaskie, przez co można je przysunąć bardzo blisko i uzyskać większe pole widzenia niż w większości konkurencyjnych HMD. Nie brakuje też miejsca na okulary (kosztem pewnej utraty pola widzenia). Przy czym o ile sam Index nie ma problemu z parowaniem, to już okulary pod nim schowane mają.

Jak można się spodziewać, choćby z powodu oszczędności miejsca i masy, Valve zastosowało soczewki Fresnela. Niestety nie ma nic za darmo i Indeksowi doskwierają nieco refleksy w stylu śreżogi (ang. god rays). Dla mnie zauważalne były tylko przy białych obiektach na czarnym tle (głównie ekrany ładowania gier). 
    
Wygoda użytkowania jest bardzo wysoka. Przed założeniem przerażała mnie masa HMD, ponad 800g (dla porównania: to ponad połowa masy integralnego kasku motocyklowego). Okazało się, że obawy były całkowicie bezpodstawne. mocowanie jest pewne i wygodne - w ogóle nie czuje się tej masy. Zmęczeniu prędzej ulegają nogi i ręce niż głowa i kark.

Nie doświadczyłem jakichkolwiek nudności czy bólu głowy. 

Zintegrowany dźwięk robi wrażenie. Index w zasadzie nie ma słuchawek, ale oddalone nieco od uszu głośniki. Głośniki są tak skuteczne, że gdy HMD leżał metr ode mnie i zagrał motyw Valve, to sprawdzałem czy moje kolumny są wyłączone.

Z przodu gogli znajdują się dwie kamery, które można wykorzystać do wyświetlania w wirtualnym świecie "matriksowego" widoku otoczenia.

Kontrolery

Kontrolery to też najwyższa półka. Są precyzyjnie śledzone i wykrywają położenie palców. Przy czym pierwsze wrażenie nie było idealne. Okazuje się, że podobnie jak HMD tak i kontrolery potrzebują dość dobrego ułożenia. Dodatkowo "uczą się" położenia i ruchów palców.
W Internecie sporo zajęła dyskusja na team gałki analogowej, dokładniej braku "klikania" w pewnych gdy używa się jej jako przycisku. Sprawdziłem, moje gałki też nie klikają w pewnych położeniach.

 

Imersja

Duże pole widzenia, odświeżanie 144Hz, precyzyjne śledzenie, zaawansowane kontrolery i sugestywny dźwięk pomagają oszukać mózg. Wiele czynności wydaje się bardzo rzeczywiste. Np. strzelania z łuku w Longbow było dla mnie podobnym doświadczeniem do znanego z rzeczywistego świata "Archery Tag".
Złapałem się na tym, że próbowałem się oprzeć o wirtualny murek. Chciałem też zrobić krok w wirtualną przepaść... nie dałem rady.

Grą, która zrobiła na mnie największe pierwsze wrażenie był Superhot VR. Dzięki kontrolerom Valve Index obiekty (butelki, pistolety, shurikeny) są łapane i rzucane w sposób naturalny. Tutaj też błyszczy precyzja śledzenia kontrolerów i gogli.

Jedyne co może popsuć imersję może zbyt mały pokój, wolny obszar do gry. 2 x 3 m, to moim zdaniem absolutne minimum, żeby dobrze się bawić.

Stacje bazowe

Lighthouse drugiej generacji to spory krok na przód w stosunku do stacji bazowych znanych z HTC Vive. Zasięg tych ostatnich ograniczała moc błysku synchronizacyjnego. Nowe Lighthouse już z niego nie korzystają, informacja o czasie kryje się w modulacji promienia lasera przemiatanego po pokoju.

Valve dodało do stacji podstawki, które ja jednak wolałem przykręcić do ściany (w zestawie są też kołki rozporowe). Co mnie nieco zaskoczyło, Lighthouse 2.0 mimo tylko jednego silnika (wcześniej były 2) są słyszalne i wibrują. Oczywiście podczas gry nie są zauważalne.


Valve Index a Linux

Na początek dobre wieści: Index wystartował bez problemu na Kubuntu 19.04. A teraz gorsze:
  • sporo funkcji SteamVR jeszcze nie działa pod Linuksem, np. nie da się zaktualizować firmware HMD,
  • żeby mieć dźwięk używając kart AMD, potrzebny jest kernel w wersji nie niższej niż 5.2.3,
  • wybór gier natywnych jest bardzo ograniczony,
  • Proton nie daje sobie rady z wieloma grami,
  • wydajność często kuleje.
Poniżej gra Longbow uruchomiona (na RX580 i Ryzenie 1700) z użyciem Proton i DXVK oraz kompilatora shaderów Valve ACO przy skalowaniu SteamVR 100%. Wydajność pozostawia sporo do życzenia (dla porównania: czas renderowania klatki na Windows to jakieś 7-8 ms):





poniedziałek, 22 kwietnia 2019

Instalacja D9VK w Protonie [Aktualizacja]

Aktualizacja 11.08.2019

D9VK jest teraz zintegrowany z Protonem i nie trzeba niczego instalować. Wystarczy w opcjach uruchamiania gry wpisać:

PROTON_USE_D9VK=1 %command%

Jeśli gra nie startuje warto sprawdzić czy są zainstalowane 32-bitowe biblioteki:  libxcb-randr0:i386 mesa-vulkan-drivers:i386

Pierwotny post:

D9VK jest dla Direct3D9 tym samym czym dla Direct3D11 jest DXVK. Tłumaczy wywołania Direct3D do api Vulkan. Niestety D9VK nie jest jeszcze częścią Valve Proton i chcąc z niego skorzystać należy zainstalować odpowiednie DLL samodzielnie.

Uwaga: na chwilę obecną D9VK nie jest ukończonym projektem i wiele gier może działać z błędami lub nie działać w ogóle.

Pobieramy paczkę z prekompilowanymi DLL stąd.

Rozpakowujemy ją w wygodnym miejscu i wchodzimy do katalogu z skryptem instalacyjnym:
cd build/dxvk-release/
Z racji, że chcemy aktywować D9VK dla konkretnej gry ustawiamy zmienną:
export WINEPREFIX=/katalogbiblioteki/SteamLibrary/steamapps/compatdata/identyfikatorgry/pfx
identyfikatorgry - najłatwiej go znaleźć otwierając stronę gry w sklepie Steam, i kopiując liczbę z adresu. Np. w https://store.steampowered.com/app/217140/Rise_of_the_Triad/ identyfikatorem jest 217140.

Następnie uruchamiamy skrypt instalacyjny:
./setup_dxvk.sh install
Powinniśmy zobaczyć okienko wyglądające tak:

 
Od tej chwili gra powinna korzystać z D9VK. Dla poprawy wydajności warto wyłączyć logowanie w opcjach uruchamiania gry:

DXVK_LOG_LEVEL=none %command%
 
Jeśli (to krok opcjonalny) w opcjach uruchamiania gry wpiszemy:
DXVK_HUD=1 DXVK_LOG_LEVEL=none %command%
To w lewym górnym rogu ekranu zobaczymy informację o użyciu D9VK:



Gdyby coś poszło nie tak to D9VK można odinstalować (oczywiście po ustawieniu WINEPREFIX tak samo jak przy instalacji) poleceniem:
./setup_dxvk.sh uninstall


PS
Rise of The Triad 2013 użyte jako przykład potrzebuje jeszcze jednej zmiany by wystartować (nieważne czy z D9VK czy bez) - trzeba pominąć launcher gry.
Można to zrobić tworząc własny, uproszczony launcher. Najpierw tworzymy plik  ROTTLauncher.c o treści:

#include < stdlib.h > 
int main(int argc, char **argv) 
{ 
    return system("Win64\\ROTT.exe"); 
}
Potem kompilujemy go z użyciem MinGW:
i686-w64-mingw32-gcc ROTTLauncher.c -o ROTTLauncher.exe

Polecenie i pakiet zawierający MinGW może się nieco różnić w zależności od dystrybucji.W przypadku Ubuntu pakiet nazywa się gcc-mingw-w64-i686.

Tak przygotowanym plikiem zastępujemy oczywiście oryginalny launcher w katalogu z grą.