Starea actuală și soluții pentru OpenGL prin Windows Remote [închis] (Programare, Opengl, Opengl Es, Sdl, Acces De La Distanță, Glfw)

SairesArt a intrebat.

OpenGL și Windows Remote nu se înțeleg prea bine.

Soluțiile pentru acest lucru depind de cazul de utilizare, iar răspunsurile sunt fragmentate în profunzimile vaste ale rețelei.Aceasta este o scriere pe care mi-aș fi dorit să existe când am început să cercetez acest lucru, atât pentru programatori, cât și pentru cei care nu sunt programatori.

Problema:

O sesiune RDP de Windows nu expune placa grafică, cel puțin nu direct. De exemplu, nu se poate modifica rezoluția desktop-ului, iar driverele pentru plăci grafice de obicei doar dezactivează meniurile de setare ale acestora. Pornirea unui context OpenGL mai mare decât v1.1 eșuează din această cauză. Sugestia „Nu folosiți WindowsRemote”, sugerată adesea, în special în IRC-urile de asistență, nu este, din păcate, o opțiune pentru mulți. În multe medii corporative, Windows Remote este un instrument utilizat în mod constant și o aplicație trebuie să funcționeze și acolo.

Soluții de rezolvare pentru cei care nu sunt programatori

Puteți lansa programul OpenGL, permițându-i să vadă placa grafică, să creeze un context OpenGL și apoi să se conecteze prin WindowsRemote. Acest lucru funcționează întotdeauna, deoarece Windows remote doar transferă conținutul ferestrei. Acest lucru poate fi realizat prin:

  • Un script batch, care închide sesiunea și pornește programul, permițându-vă să vă conectați la programul care rulează deja. (Sursa)
  • Utilizarea VNC sau a altora pentru a intra de la distanță în mașină, pornirea programului și apoi trecerea la Windows Remote. (Program VNC simplu, de asemenea cu un client portabil)

Soluții de rezolvare pentru coduri

(Numai pentru OpenGL ES)Traduceți OpenGL în DirectX. DirectX funcționează sub Windows Remote flawselly și are chiar și un Software rendering fallback integrat în DX11 în cazul în care ceva eșuează.

  • Utilizați proiectul ANGLE pentru a face acest lucru în timpul execuției. Aceasta este ceea ce QT sugerează oficial să faceți și modul în care Chrome și Firefox implementează WebGL. (Sursa)

Treceți la randarea software ca soluție de rezervă. Unele programe CAD, cum ar fi 3dsMax, fac acest lucru, de exemplu:

  • În SDL2 puteți utiliza SDL_CreateSoftwareRenderer (Sursa)
  • În cadrul GLFW versiunea 3.3 va lansa OSMesa (redarea în afara ecranului de la Mesa), între timp puteți construi versiunea Github cu -DGLFW_USE_OSMESA=TRUE, dar eu personal încă mă lupt să o fac să funcționeze (Sursa)
  • Utilizați direct pipe-ul LLVM al lui Mesa pentru o implementare rapidă a OpenGL. (Sursa)

Diverse:

  • Utilizați OpenGL 1.1: Windows dispune de o implementare integrată a OpenGL 1.1 și mai devreme. Unele motoare de jocuri au o revenire la acest lucru și, prin urmare, funcționează sub Windows Remote.
  • Se pare că există un middle-ware care permite chiar și OpenGL 4 prin Windows Remote, dar face parte dintr-un pachet mai mare și este o soluție comercială. (Sursa)

Orice alte soluții sau corecții sunt foarte apreciate.

Comentarii

  • -DGLFW_USE_OSMESA pare să fie doar pentru Linux, pe baza fișierului glfw CMakeLists.txt… -.  > Por rogerdpack.
  • Acum puteți utiliza OpenGL prin desktop la distanță și pe GPU-urile de consum nvidia. reddit.com/r/nvidia/comments/fx202t/… –  > Por informatorius.
5 răspunsuri
quetzalcoatl

În conformitate cu acest articol se pare că acum RDP gestionează versiuni mai noi de Direct3D și OpenGL pe Windows 10 și Windows Server 2016, dar în mod implicit este dezactivat prin Politica de grup.

Presupun că, din motive de performanță, utilizarea unei plăci grafice hardware este dezactivată, iar RDP utilizează un driver de placă grafică emulat de software care oferă doar câteva caracteristici de bază.

M-am lovit de această problemă atunci când am încercat să execut Ultimaker CURA prin Remote Desktop standard de la un client Windows 10 la o gazdă Windows 10. Cura a strigat „nu poate inițializa contextul OpenGL 2.0”. De asemenea, am observat că Repetier Host’s fereastra de „previzualizare” rulează teribil de lent, iar Repetier detectează doar o OpenGL 1.1 carte. Se potrivește destul de mult cu descrierea „doar caracteristici de bază”.

Prin rularea gpedit.msc apoi navigând la

Local Computer PolicyComputer ConfigurationAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostRemote Session Environment

și modificând valoarea

Utilizarea adaptoarelor grafice hardware pentru toate sesiunile Remote Desktop Services

Am reușit să execut cu succes Ultimaker CURA prin intermediul fără probleme, iar Repetier-Host afișează acum OpenGL 4.6, iar totul rulează în sfârșit rapid așa cum ar trebui.


Notă de la genpfault:Ca de obicei, această politică este păstrată în grupul de registre HKLM din

HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindows NTTerminal Services

Set REG_DWORD:bEnumerateHWBeforeSW la 1 pentru a activa utilizarea GPU-urilor în RDP.

Comentarii

  • HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindows NTTerminal Services, REG_DWORD:bEnumerateHWBeforeSW=1 –  > Por genpfault.
  • Notă: numele politicii de grup pare a fi „Use hardware graphics adapters for all Remote Desktop Services sessions” (Utilizați adaptoare grafice hardware pentru toate sesiunile Remote Desktop Services), mai degrabă decât „Use the hardware default graphics adapter for all Remote Desktop Services” (Utilizați adaptorul grafic hardware implicit pentru toate sesiunile Remote Desktop Services), dar nu am vrut să schimb răspunsul fără să fiu 100% sigur că nu mă uit la o cheie greșită. –  > Por Wai Ha Lee.
  • @WaiHaLee că este total posibil. În acest moment nu dețin niciun Windows en-us, iar ceea ce am scris a fost o traducere din limba mea maternă, susținută de câteva căutări rapide pe Google pentru a verifica de două ori numele politicii de grup. Dacă aveți o versiune en-us sau en-gb de Windows, v-aș fi recunoscător dacă ați putea să verificați și să actualizați textul cu ceea ce vedeți în versiunea EN. default ar putea face o diferență (există o noțiune de „adaptor grafic implicit” în sistemul de operare), dar sunt destul de sigur că nu am văzut nicio politică cu nume asemănător, așa că ceea ce vedeți acolo este, cel mai probabil, aceeași politică despre care am scris…  > Por quetzalcoatl.
  • Bine – mulțumesc pentru confirmare. Am actualizat răspunsul cu șirul așa cum apare pe mașina mea en-gb – și am adăugat url-ul pentru o captură de ecran (tot de pe mașina mea) la rezumatul ediției. –  > Por Wai Ha Lee.
  • Se pare (din câte îmi dau seama fără prea mult efort) că un dispozitiv hardware local este folosit pentru randare, iar conținutul framebuffer-ului rezultat este trimis către client pentru afișare. –  > Por codeshot.
Michael Kenzel

Windows Remote Desktop va deschide o sesiune la distanță. Cred că, cel puțin în ceea ce privește NVIDIA, doar driverele pentru plăcile profesionale (Quadro) pentru stații de lucru au suport pentru sesiuni la distanță (nu am testat niciodată acest lucru personal, totuși). Driverele GeForce normale nu funcționează într-o sesiune la distanță (din experiența mea). Acest lucru nu afectează doar OpenGL. Din câte îmi amintesc, de exemplu, nici CUDA nu va funcționa într-o sesiune la distanță.

Personal, dacă trebuie să lucrați de la distanță la chestii care utilizează GPU, aș recomanda TeamViewer sau VNC. Probabil că acestea au nevoie de mai multă lățime de bandă, dar, deoarece vor controla pur și simplu de la distanță sesiunea interactivă locală, mai degrabă decât să lucreze într-o sesiune la distanță, totul va funcționa la fel ca și cum ați fi stat în fața mașinii. Un lucru de care trebuie să fiți conștienți este că utilizarea TeamViewer/VNC va interfera, desigur, cu oricine care este de fapt care stă în fața mașinii…

Comentarii

  • Sugestia dvs. se află deja pe lista de soluții. Problema este că vreau ca aplicația mea să funcționeze peste tot. Adică, oare voi livra o aplicație cu „Dragă client, s-ar putea să trebuiască să cumperi o placă grafică Quadro de 1000$ sau să nu mai folosești Windows Remote” 😀 -.  > Por SairesArt.
  • Ei bine, mă tem că asta e realitatea. Se pare că Remote Desktop este considerată o funcție profesională pentru care cel puțin unii producători de plăci grafice vor să plătești o primă. Nu prea ai ce să faci în privința asta. Cu excepția, poate, a folosi Direct3D, deoarece se pare că asta funcționează… –  > Por Michael Kenzel.
  • Acest tip de lucru este, din păcate, o temă destul de comună cu OpenGL. Deoarece nu există o presiune reală pentru a susține caracteristici care nu sunt utilizate în mod obișnuit de către consumatori (iar OpenGL nu este, în general, atât de proeminent în aplicațiile de consum), furnizorii de plăci grafice sunt liberi să decidă singuri pentru ce vor să ceară un cost suplimentar. Printre exemplele, în afară de suportul pentru Remote Desktop, se numără redarea stereo sau capacitatea de a alege în mod programatic ce adaptor să folosească. În Direct3D, toate acestea funcționează pe toate plăcile, cel mai probabil pentru că Microsoft le obligă să le suporte dacă vor să le numească plăci Direct3D XXX… –  > Por Michael Kenzel.
  • Da, 100% de acord. De aceea am făcut writeup-ul, pentru a enumera toate posibilitățile în cazul în care trebuie să folosești OpenGL. Pot să compilez și să pornesc de la distanță aplicația mea cu backend D3D11 foarte bine. Dar aceasta nu este o opțiune, din moment ce vreau să folosesc compute shader-ul OpenGL 4. –  > Por SairesArt.
  • Funcționează acum cu Geforce: khronos.org/news/permalink/… –  > Por palfi.
Джон Доу

OpenGL funcționează foarte bine prin RDP cu plăci Nvidia profesionale fără nimic de genul mașinilor virtuale și RemoteFX. Pentru Quadro (Quadro 4000 testat) aveți nevoie de driverul 377.xx. Pentru M60 puteți folosi același driver. Dacă doriți să utilizați ultimul driver cu M60, trebuie să schimbați modul driverului în modul WDDM (consultați c:Program FilesNVIDIA CorporationNVSMI
vidia-smi.1.pdf). Este posibil ca în acest ultim caz să existe unele probleme cu licențierea.

Comentarii

  • De acord, acest lucru combinat cu actualizarea setărilor RDC funcționează. > nvidia-smi -g {card number} -dm 0. –  > Por uniquelau.
rogerdpack

Unii oameni recomandă să folosiți „tscon.exe” dacă puteți: https://stackoverflow.com/a/45723167/32453 sau să folosiți un programator pentru a o face pe hardware nativ: https://stackoverflow.com/a/41839102/32453 sau să creați o politică de grup:https://community.esri.com/thread/225251-enabling-gpu-rendering-on-windows-server-2016-windows-10-rdp

poate copiați opengl32.dll (sau opengl64.dll) în dir-ul executabilului dvs.: https://blender.stackexchange.com/a/73014 și o versiune mai nouă a dll-ului: https://fdossena.com/?p=mesa/index.frag

Comentarii

  • Vă mulțumim foarte mult! Mesa3D pentru Windows funcționează perfect (care este furnizat în ultimul dvs. link). –  > Por Hustlion.
Damian Dixon

Remote Desktop și OpenGL nu se joacă foarte bine. Când vă conectați la o cutie Windows, driverul OpenGL este descărcat și vă treziți cu emulația software a OpenGL.

Atunci când vă deconectați de la Windows, driverul OpenGL nu este reîncărcat. Acest lucru cauzează probleme atunci când executați teste pe mașină, deoarece trebuie să vă conectați fizic la mașină pentru a reseta driverele.

Soluția pe care am ajuns să o folosesc a fost următoarea:

  • Să dezactivez Remote Desktop.
  • Ștergeți toate celelalte programe de acces la desktop la distanță. Pentru că, dacă este folosit pentru conectarea de la distanță, setul actual de drivere încărcate poate fi dat peste cap.
  • Instalați NoMachine

NoMachine este preferatul meu personal (atunci când nu joacă) din mai multe motive:

  • Accelerarea hardware a compresiei (video de pe desktop).
  • Funcționează pe Windows și Linux.
  • Funcționează bine pe conexiuni cu lățime de bandă redusă, mai ales dacă clientul și serverul au hardware-ul necesar pentru compresia fluxului de date.
  • Pe Linux, obțineți desktop-ul așa cum l-ați lăsat ultima dată când ați stat în fața mașinii.
  • Pe Windows nu afectează OpenGL.
  • în prezent este gratuit pentru uz personal și comercial. Verificați licența în cazul în care s-a schimbat.

Atunci când NoMachine se joacă, acaparează CPU, dar acest lucru se întâmplă rar. Cu toate acestea, este în curs de dezvoltare activă

Altele de luat în considerare:

  • TurboVNC
  • TightVNC
  • TeamViewer – gratuit doar pentru uz personal.