Azure 是否允许 App 需要 OpenGL,有什么办法解决吗?

Does Azure allow App need OpenGL, any way to go around?

我希望在 Azure 虚拟机上托管一个远程应用程序,该应用程序是使用 python 在 VTK 之上开发的。每次,我都会收到崩溃消息 "vtkWin32OpenGLRenderWindow...GL version2.1 with the gpu_shader4 extension is not supported by your graphic driver"。 我尝试了 windows server 2016 和 windows 10 虚拟机,同样崩溃。

Azure 是否不支持 运行 应用程序需要 OpenGl 支持?除非租超级贵的N台虚拟机?

有什么建议可以让我的应用程序 运行 在正常成本的虚拟机上运行而无需过多修改我的程序吗?

回答:

Azure VM 通常没有 GPU,除非 Azure N 系列 VM:https://blogs.technet.microsoft.com/hybridcloudbp/2016/12/13/n-series-azure-vms-with-gpu/

解法:

1)构建Mesa3D+LLvmpipe版本opengl32.dll,使用软件光栅化器。

您可以关注:https://fdossena.com/?p=mesa/build.frag 构建您自己的或从互联网下载预构建的 opengl32.dll。

2)替换windows/system32/opengl32.dll:

将 Mesa opengl32.dll 保存在应用程序的同一目录中不起作用 - 尚不清楚原因。

替换 windows/ssytem32/openggl32.dll,需要将 opengl32.dll 的所有权从 trustedinstaller 更改为管理员,并将完全访问权限分配给管理员。

*Mesa3D&LLvmpipe 很棒!但是构建 Mesa3D+LLvmpipe 是一件痛苦的事情!

当过程在某种程度上自动化时,从源代码构建 Mesa 并不难: https://github.com/pal1000/mesa-dist-win

您不必在没有 GPU 的 VM 上混淆文件权限和覆盖 opengl32.dll 来安装 Mesa3D。有一个注册表调整告诉 Windows 使用 Mesa3D 作为默认软件光栅器。只需将 Mesa3D opengl32.dll 文件重命名为 mesadrv.dll,将它们放入 windows\system32 和 windows\syswow64(如果适用),然后应用这些注册表调整:

  • 对于 64 位应用程序或 32 位应用程序的 32 位应用程序Windows

REGEDIT4

; https://technet.microsoft.com/en-us/library/cc749368.aspx
; https://www.msfn.org/board/topic/143241-portable-windows-7-build-from winpe-30/page-5#entry942596
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL]
"DLL"="mesadrv.dll"
"DriverVersion"=dword:00000001
"Flags"=dword:00000001
"Version"=dword:00000002
  • 对于 64 位上的 32 位应用程序Windows

REGEDIT4

; https://technet.microsoft.com/en-us/library/cc749368.aspx
; https://www.msfn.org/board/topic/143241-portable-windows-7-build-from winpe-30/page-5#entry942596
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL]
"DLL"="mesadrv.dll"
"DriverVersion"=dword:00000001
"Flags"=dword:00000001
"Version"=dword:00000002

参考:https://www.mesa3d.org/llvmpipe.html

我终于让它适用于一个名为 PsychoPy 的程序,该程序需要 OpenGL 2.0 的所有功能。我必须使用 7zip 文件“mesa3d-21.3.5-release-msvc.7z”顶部的系统范围安装脚本“systemwidedeploy.cmd”来安装它,详情如下。它已经编译好了,你只需要下载它并解压缩它。 Opengl Extensions Viewer 将版本报告为 3.3。 (如何通过powershell获取版本?)

“虚拟机中的 OpenGL - Thomas Schwery”https://thomas.inf3.ch/2019-06-12-opengl-kvm-mesa3d/index.html

这是安装脚本中的一些相关代码。看起来有几个额外的 dll 文件要复制。

@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 IF EXIST "%mesaloc%\x86\libgallium_wgl.dll" copy "%mesaloc%\x86\libgallium_wgl.dll" "%windir%\SysWOW64\mesadrv.dll"
@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 IF EXIST "%mesaloc%\x64\libgallium_wgl.dll" copy "%mesaloc%\x64\libgallium_wgl.dll" "%windir%\System32\mesadrv.dll"

@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 IF EXIST "%mesaloc%\x86\libglapi.dll" copy "%mesaloc%\x86\libglapi.dll" "%windir%\SysWOW64"
@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 IF EXIST "%mesaloc%\x64\libglapi.dll" copy "%mesaloc%\x64\libglapi.dll" "%windir%\System32"

@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 IF EXIST "%mesaloc%\x86\dxil.dll" copy "%mesaloc%\x86\dxil.dll" "%windir%\SysWOW64"
@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 IF EXIST "%mesaloc%\x64\dxil.dll" copy "%mesaloc%\x64\dxil.dll" "%windir%\System32"

@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "DLL" /t REG_SZ /d "mesadrv.dll" /f
@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "DriverVersion" /t REG_DWORD /d "1" /f
@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "Flags" /t REG_DWORD /d "1" /f
@IF /I %PROCESSOR_ARCHITECTURE%==AMD64 REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "Version" /t REG_DWORD /d "2" /f

@REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "DLL" /t REG_SZ /d "mesadrv.dll" /f
@REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "DriverVersion" /t REG_DWORD /d "1" /f
@REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "Flags" /t REG_DWORD /d "1" /f
@REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\OpenGLDrivers\MSOGL" /v "Version" /t REG_DWORD /d "2" /f