OpenGL在Windows远程桌面上的现状和解决方案

32

OpenGL和Windows远程桌面不兼容。

解决方案取决于使用情况,答案分散在网络的各个角落。以下是我希望在开始研究此问题时存在的内容,供编码人员和非编码人员参考。

问题:

Windows的RDP会话不会直接显示图形卡。例如,您无法更改桌面分辨率,而GraphicsCard驱动程序通常只禁用其设置菜单。由于这个原因,启动高于v1.1的OpenGL上下文会失败。通常建议尽量避免使用Windows Remote,但在许多企业环境中,Windows Remote是经常使用的工具,因此应用程序也必须在其中工作。

非编码人员的解决方法

您可以启动OpenGL程序,让它看到图形卡,创建OpenGL上下文,然后通过Windows远程连接。这总是有效的,因为Windows Remote只传输窗口内容。可以通过以下方式实现:

  • 批处理脚本,关闭会话并启动程序,使您可以连接到已运行的程序。(来源
  • 使用VNC或其他远程连接到机器,启动程序,然后切换到Windows Remote。(简单VNC程序,也有便携客户端

Coder解决方法

(仅适用于OpenGL ES)将OpenGL翻译为DirectX。 DirectX在Windows Remote下可以无缝运行,甚至在DX11中还内置了软件渲染备用方案。

  • 使用ANGLE项目在运行时执行此操作。这是QT正式建议的做法,以及Chrome和Firefox实现WebGL的方式。 ()

作为回退方案,切换到软件渲染。例如,一些CAD软件如3dsMax就是这样做的:

  • 在SDL2下,您可以使用SDL_CreateSoftwareRenderer ()
  • 在GLFW版本3.3中将发布OSMesa(Mesa的离屏渲染),与此同时,您可以使用-DGLFW_USE_OSMESA = TRUE构建Github版本,但我个人仍然难以使其运行()
  • 使用 Mesa 的 LLVM 管道进行快速的 OpenGL 实现。(来源)
  • 其他:

    • 使用 OpenGL 1.1:Windows内置了OpenGL 1.1及更早版本的实现。一些游戏引擎具有内置的回退选项,因此可以在 Windows 远程下工作。
    • 显然有一个中间件,可以通过 Windows 远程甚至使用OpenGL 4,但它是一个商业解决方案的一部分。(来源

    欢迎提供任何其他解决方案或更正意见。

    [10] Nvidia -> https://www.khronos.org/news/permalink/nvidia-provides-opengl-accelerated-remote-desktop-for-geforce-5e88fc2035e342.98417181


    根据glfw的CMakeLists.txt文件,-DGLFW_USE_OSMESA似乎只适用于Linux系统... - rogerdpack
    1
    现在,您可以在NVIDIA消费级GPU上通过远程桌面使用OpenGL。https://www.reddit.com/r/nvidia/comments/fx202t/opengl_via_rdp_for_consumer_cards/ - informatorius
    4个回答

    16
    根据这篇文章,似乎现在RDP可以处理Windows 10和Windows Server 2016上的更新版本Direct3D和OpenGL。但是默认情况下,由于组策略的限制,这个功能被禁用了。
    我认为出于性能方面的考虑,使用硬件图形卡被禁用了,RDP使用的是软件仿真图形卡驱动程序,只提供一些基本功能。
    我在尝试从Windows 10客户端通过标准远程桌面连接到Windows 10主机时遇到了这个问题,当时想运行Ultimaker CURA。Cura显示"无法初始化OpenGL 2.0上下文"。我还注意到Repetier Host的“预览”窗口运行非常缓慢,并且Repetier仅检测到OpenGL 1.1卡。这基本符合“仅具有基本功能”的描述。
    通过运行gpedit.msc,然后导航到

    本地计算机策略\计算机配置\管理模板\Windows组件\远程桌面服务\远程桌面会话主机\远程会话环境

    并更改

    对所有远程桌面服务会话使用硬件图形适配器

    的值,我能够成功地运行Ultimaker CURA,没有任何问题,并且Repetier-Host现在显示OpenGL 4.6,一切都可以快速运行,就像应该的那样。

    genpfault的提示: 通常情况下,此策略被保存在HKLM注册表组中。

    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services
    

    REG_DWORD:bEnumerateHWBeforeSW设置为1,以打开在RDP中使用GPU的功能。


    2
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services, REG_DWORD:bEnumerateHWBeforeSW=1 - genpfault
    1
    注意:组策略的名称似乎是“为所有远程桌面服务会话使用硬件图形适配器”,而不是“为所有远程桌面服务会话使用默认硬件图形适配器”,但我不想在没有100%确定我没有看错键的情况下更改答案。 - Wai Ha Lee
    1
    @quetzalcoatl:我在https://www.khronos.org/news/permalink/nvidia-provides-opengl-accelerated-remote-desktop-for-geforce-5e88fc2035e342.98417181上找到了这个驱动程序的修订版本,正如palfi在下面的评论中提到的。我不知道这是否是确切的版本,但我之前使用的版本比这还要老,并且进行了驱动程序升级后立即开始工作,甚至无需重新启动。 - rvjr
    2
    如果您正在使用nVidia显卡,则需要安装Nvidia-opengl-rdp(可能需要nvidia帐户)。https://www.khronos.org/news/permalink/nvidia-provides-opengl-accelerated-remote-desktop-for-geforce-5e88fc2035e342.98417181。我有一张rtx 2080,安装了这个后,我可以在我的RDP中生成openGL上下文/窗口。 - Totomobile
    1
    请注意:对于未来的读者,策略是保存在bEnumerateHWBeforeSW值中的,但不是从那里读取的。您不能通过更改注册表值来更改设置。来自Windows注册表更改不会反映在组策略上。:“组策略引擎进行单向处理:在GPO中定义的设置应用于注册表、文件系统等,覆盖您本地设置的任何值”。 - Wai Ha Lee
    显示剩余9条评论

    1

    一些人建议使用"tscon.exe":https://dev59.com/OJ7ha4cB1Zd3GeqPkYFY#45723167或者使用调度程序在本地硬件上执行它:https://dev59.com/OJ7ha4cB1Zd3GeqPkYFY#41839102或创建一个组策略:https://community.esri.com/thread/225251-enabling-gpu-rendering-on-windows-server-2016-windows-10-rdp

    也许将opengl32.dll(或opengl64.dll)复制到您的可执行文件目录中:https://blender.stackexchange.com/a/73014并使用较新版本的DLL:https://fdossena.com/?p=mesa/index.frag


    1
    非常感谢! Mesa3D for Windows 完美运行(这是您最后一个链接提供的)。 - Hustlion

    1

    使用专业的Nvidia显卡,无需任何虚拟机和RemoteFX,OpenGL可以通过RDP很好地工作。对于Quadro(测试了Quadro 4000),您需要驱动程序377.xx。对于M60,您可以使用相同的驱动程序。如果您想要在M60上使用最新的驱动程序,则必须将驱动程序模式更改为WDDM模式(请参见c:\ Program Files \ NVIDIA Corporation \ NVSMI \ nvidia-smi.1.pdf)。在这种情况下可能存在一些许可问题。


    同意,这个命令和更新RDC设置一起使用可以解决问题。> nvidia-smi -g {card number} -dm 0. - uniquelau

    0

    远程桌面和OpenGL不太兼容。当您连接到Windows桌面时,OpenGL驱动程序会被卸载,您最终会得到OpenGL的软件仿真。

    当您断开与Windows桌面的连接时,OpenGL驱动程序不会重新加载。这在您在机器上运行测试时会导致问题,因为您必须物理登录到机器上重置驱动程序。

    我最终使用的解决方案是:

    • 禁用远程桌面。
    • 删除所有其他远程桌面访问软件。因为如果它用于远程登录,则当前加载的驱动程序集可能会出现问题。
    • 安装NoMachine

    NoMachine是我个人最喜欢的(当它没有问题时)有很多原因:

    • 压缩的硬件加速(桌面视频)。
    • 适用于Windows和Linux。
    • 在低带宽连接上工作良好,特别是如果客户端和服务器具有压缩数据流所需的硬件。
    • 在Linux上,您可以获得您上次坐在机器前留下的桌面。
    • 在Windows上,它不会影响OpenGL。
    • 目前可供个人和商业使用免费。请检查许可证以防更改。

    当NoMachine出现问题时,它会占用CPU,但这种情况很少发生。不过,它正在积极开发中。

    其他可考虑的选项:

    • TurboVNC
    • TightVNC
    • TeamViewer - 仅限个人免费使用。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接