OpenGL如何找到在Windows上使用的实现?

Dol*_*000 5 windows opengl

我有一个通过JOGL使用OpenGL的Java程序,并且有一些错误只出现在我想要调试的Windows上.为此,我尝试使用Windows设置备用计算机,但在调试程序时遇到了一个奇怪的问题:

当我通过Java Web Start"正常"运行程序时,它可以正常工作,但是当我编译程序并尝试通过命令行java启动程序或通过NetBeans(我认为它做同样的事情)运行它时,它似乎使用了不支持可编程着色或其他任何东西的不同且非常原始的OpenGL实现.

在研究这个问题时,我让自己了解在Windows上运行的OpenGL程序加载opengl32.dll,这显然是Windows附带的一个公共库(如果我错了就纠正我),并反过来加载"真正的"OpenGL实现和转发OpenGL函数调用它.(它似乎也有点用词不当,因为它实际上是在一个64位进程中加载​​到一个明显高于2 32的基址.)

使用Process Explorer,我看到,当我在Java Web Start(它工作的地方)下运行程序时,它会加载库ig4icd64.dll,我假设它是Intel GPU驱动程序的实际OpenGL实现库; 而当试图运行程序时java.exe,opengl32.dll加载,但ig4icd64.dll从未加载,这似乎证实了我怀疑它正在使用不同的OpenGL实现.

因此,这就引出了一个主要问题:如何opengl32.dll选择要使用的OpenGL实现,以及如何影响此选择以确保加载正确的实现?有什么方法可以调试这个?(这两个上下文之间有什么不同,导致它选择不同的实现?在这两种情况下,都使用64位Java,因此在32位或64位实现之间不应该混淆.)

更新:我在微软的网站上发现这个页面声称通过注册表项中的OpenGLDriverName值找到了OpenGL ICD HKLM/System/CurrentControlSet/Control/Class/{Adapter GUID}/0000/.ig4icd64.dll但是,该值确实包含,并且可能更奇怪的是,使用Process Monitor监视Java进程的系统调用(如果这是正确的Windows术语)表明它从不尝试访问该密钥.我不能说我知道这是否意味着该文章不正确,或者我是否错误地使用了Process Monitor,或者它是否是其他内容.

dat*_*olf 5

\n

在研究这个问题时,我让自己明白,在 Windows 上运行的 OpenGL 程序会加载 opengl32.dll,这显然是 Windows 附带的一个通用库(如果我错了,请纠正我),然后又加载“ real”OpenGL 实现并将 OpenGL 函数调用转发给它。

\n
\n\n

是的,这就是它的工作原理。充当可安装客户端驱动程序(ICD) 和使用 OpenGL 的程序opengl32.dll之间的管道。

\n\n
\n

因此,这就引出了主要问题:opengl32.dll 如何选择要使用的 OpenGL 实现,以及如何影响此选择以确保加载正确的实现?有什么方法可以调试这个?

\n
\n\n

它根据窗口类标志进行选择(这不是 Java 类,而是作为 Windows API 一部分的一组窗口设置,请参阅https://msdn.microsoft.com/en-us/library/ windows/desktop/ms633577(v=vs.85).aspx了解详细信息),窗口样式标记为窗口设置的像素格式、窗口的位置(这意味着它位于哪个屏幕和图形设备上)以及上下文创建标志。

\n\n

例如,如果您要将其作为服务启动,则根本没有图形设备可以在其上创建窗口。如果您要在远程桌面会话中启动它,它将在无头软件光栅化实现上运行。

\n\n

我不知道 CLIjava解释器与 WebStart 有何不同的具体细节。但是 IIRC 您使用javaw(注意额外的w)用于 GUI 程序。

\n\n
\n\n
\n

(它似乎也有点用词不当,因为它实际上是在 64 位进程中加载​​的,基地址明显高于 2^32。)

\n
\n\n

opengl32.dll不仅如此,所有Windows 系统 DLL 都被命名为 \xe2\x80\xa632,即使在 64 位环境中也是如此,而且它们的位置甚至会\\Windows\\System32增加混乱。原因很简单:编译 64 位时源代码级别向后兼容。如果所有库名称都已更改为 \xe2\x80\xa664,那么为了编译 64 位环境的程序,所有字符串文字和对库的引用都必须重命名为 \xe2\x80\xa664。

\n\n

如果它让您对命名感觉更好,请将 \xe2\x80\xa632 视为版本指示符,而不是体系结构:Win32 API 是为 Windows 9x 和 Windows NT 3 并行开发的,因此请在您的脑海中让\xe2\x80\xa632 代表“为 Windows NT 3.2 创建的 API 版本”

\n