4

我对 Windows 上 OpenGL 1.0 和 1.1 函数指针的性质有点困惑。我想我已经记下来了,但我不是 100% 确定,所以我希望有人能够确认或评论我目前的理解:

我目前的理解是,您应该使用 加载 1.2+ 函数wglGetProcAddress(),但必须使用 加载 1.0 和 1.1GetProcAddress()函数opengl32.dll。然而,引起我注意的是,它可能会根据当前的上下文wglGetProcAddress()返回不同的函数指针。HGLRC然而,大概 1.0 和 1.1 的指针GetProcAddress()总是相同的。这种行为上的差异感觉很不寻常。

所以,假设我有多个HGLRC对象,我们将它们称为Aand B。我调用wglGetProcAddress()并将结果保存在单独的指针池中,一个A用于B. A然而,我还必须将 1.0 和 1.1 函数加载到这些指针池中,在这种情况下,和的指针似乎B总是相同的。

令我惊讶的是 1.0 和 1.1 函数因此必须是瘦包装器,它将 OpenGL 调用重定向到与当前HGLRC. 然而,如果 Windows 上已经存在这样的重定向机制,那么我想知道为什么wglGetProcAddress()不能也使用它,因为这样做会减轻它返回依赖于上下文的指针的危险。我什至不一定需要知道这个问题的答案,但这个问题的存在让我怀疑我是否一开始就理解正确。

4

1 回答 1

4

原因很简单:OpenGL-1.1 的符号是一个固定的集合,因此接口 DLLopengl32.dll可以包含回退实现和蹦床到由图形驱动程序 (ICD) 提供的完整 OpenGL 实现中。这些符号由符号表中的接口 DLL 公开,因此可以使用GetProcAddress.

超出版本 OpenGL-1.2 的任何内容对于接口库都是未知的。因此opengl32.dll,对于这些功能,ICD 中既不包含后备方案也不包含蹦床。相反,它充当代理,将调用传递给wglGetProcAddress图形驱动程序 (ICD) 中的实际 OpenGL 实现。然而,由于不同的 OpenGL 上下文可能由不同的图形驱动程序 (ICD) 提供服务,因此结果可能是位于不同地址的符号。wglGetProcAddress不查看某些 DLL 的符号表,但可以以 ICD 认为合适的任何方式实现。

于 2014-08-09T02:02:22.890 回答