我正在制作一个用C编写的视频游戏,它使用SDL和OpenGL绘制图形。编译后的版本在Linux和Android上运行良好。
我编译了Windows版本,它也很好用,只是作为一个独立的版本。我尝试将所有编译后的文件打包为.appx
或.msix
格式,发现OpenGL在作为打包应用程序运行时报告的版本号完全不同。
我使用以下代码来获得一些OpenGL信息:
printf("Vendor graphic card: %sn", glGetString(GL_VENDOR));
printf("Renderer: %sn", glGetString(GL_RENDERER));
printf("Version GL: %sn", glGetString(GL_VERSION));
printf("Version GLSL: %sn", glGetString(GL_SHADING_LANGUAGE_VERSION));
当我作为一个独立的项目运行时,我会得到以下信息:
Vendor graphic card: Intel
Renderer: Intel(R) HD Graphics 2000
Version GL: 3.1.0 - Build 9.17.10.4459
Version GLSL: 1.40 - Intel Build 9.17.10.4459
这一切看起来都是正确的,应用程序的行为也如预期。然而,我随后将所有文件打包为.appx
文件和.msix
文件,运行时它们都报告了相同的结果:
Vendor graphic card: Microsoft Corporation
Renderer: GDI Generic
Version GL: 1.1.0
Version GLSL: (null)
不用说,我对glCreateShader
的第一个调用就崩溃了。
作为参考,我在PowerShell中使用以下命令将所有文件打包为.appx
和.msix
文件:
MakeAppx pack /d <my_file_directory> /p project.msix
SignTool sign /a /v /fd SHA256 /f mycert.pfx /p "mypassword" project.msix
有人知道是什么原因造成的吗?如果需要,很乐意提供更多信息。
根据我所做的一些研究,以及我从其他网站得到的评论,以下是我对这个问题的发现:
OpenGL对UWP的支持似乎需要一些技巧才能使其正常运行。Microsoft Store(使用.appx
和.msix
文件(正在后台将OpenGL ES调用转换为Direct3D调用,这使得获取准确信息变得更加困难。
因此,最简单的方法似乎是将项目移植到Direct3D,这应该可以解决问题中提到的问题。