opengl - OpenGL over Windows Remote 的当前状态和解决方案
问题描述
OpenGL 和 Windows Remote 不能很好地配合。
对此的解决方案取决于用例,并且答案分散在网络的广阔深处。这是我开始研究时希望存在的一篇文章,适用于编码人员和非编码人员。
问题:
Windows 的 RDP 会话不公开显卡,至少不直接公开。例如,您无法更改桌面分辨率,而显卡驱动程序通常只是禁用它们的设置菜单。因此,启动高于 v1.1 的 OpenGL 上下文会失败。特别是在支持 IRC 中,经常建议“不要使用 WindowsRemote”,不幸的是,这不是许多人的选择。在许多企业环境中,Windows Remote 是一个经常使用的工具,并且应用程序也必须在那里工作。
非编码器解决方法
你可以启动 OpenGL 程序,让它看到显卡,创建一个 opengl 上下文,然后通过 WindowsRemote 连接。这总是有效的,因为 Windows 远程只是传输窗口内容。这可以通过以下方式实现:
- 一个批处理脚本,它关闭会话并启动程序,允许您连接到已经运行的程序。(来源)
- 使用VNC或其他远程进入机器,启动程序,然后切换到Windows Remote。(简单的 VNC 程序,也带有便携式客户端)
编码器解决方法
(仅适用于 OpenGL ES)将 OpenGL 转换为 DirectX。DirectX 在 Windows Remote 下完美运行,如果出现故障,甚至在 DX11 中内置了软件渲染回退。
切换到软件渲染作为后备。例如,一些 CAD 软件(如 3dsMax)会这样做:
- 在 SDL2 下,您可以使用 SDL_CreateSoftwareRenderer ( Source )
- 在 GLFW 3.3 版下将发布 OSMesa(Mesa 的离屏渲染),同时您可以使用 -DGLFW_USE_OSMESA=TRUE 构建 Github 版本,但我个人仍然很难让它运行(来源)
- 直接使用 Mesa 的 LLVM 管道进行快速 OpenGL 实现。(来源)
杂项:
- 使用 OpenGL 1.1:Windows 具有 OpenGL 1.1 及更早版本的内置实现。一些游戏引擎具有内置的回退功能,因此可以在 Windows Remote 下工作。
- 显然有一个中间件,它甚至允许在 Windows Remote 上使用 OpenGL 4,但它是一个更大的包的一部分,并且是一个商业解决方案。(来源)
非常感谢任何其他解决方案或更正。
解决方案
根据这篇文章,现在 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 打开。
推荐阅读
- html - P标签和H2标签在同一个div内联
- svn - TortoiseSVN - “被锁定在另一个工作副本”错误
- swift - 允许 Alamofire 同步链接相关请求的模式
- javascript - 来自服务器 json 对象的数据表
- html - HTML:如何删除两个按钮之间的 <
- docker - osx docker 运行 elasticsearch 进行开发
- javascript - Coffeescript 相当于 On Document Ready
- c# - 在 C# 中使用 Html Agility Pack 获取 InnerText 忽略脚本节点
- sql - 同时进行枢轴和交叉连接
- java - 如何在@RequestBody 中传递 2 个对象?