Windows上的OpenGL 1.0和1.1功能指针

时间:2014-08-09 01:51:05

标签: windows winapi opengl wgl

我对Windows上的OpenGL 1.0和1.1函数指针的性质感到有些困惑。我想我已经失败了,但我不是百分百肯定,所以我希望有人能够确认或评论我目前的理解:

我目前的理解是,您应该使用wglGetProcAddress()加载1.2+函数,但1.0和1.1函数必须通过GetProcAddress()加载opengl32.dll 。然而,引起我注意的是,wglGetProcAddress()应该返回不同的函数指针,具体取决于哪个HGLRC上下文是当前的。然而,大概来自GetProcAddress()的1.0和1.1指针始终是相同的。这种行为上的差异感觉很不寻常。

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

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

1 个答案:

答案 0 :(得分:4)

原因很简单:OpenGL-1.1的符号是一个固定的集合,因此接口DLL opengl32.dll可以包含回退实现和trampolines到完全成熟的OpenGL实现中。图形驱动程序(ICD)。这些符号由符号表中的接口DLL公开,因此可以GetProcAddress访问。

接口库不知道任何超出OpenGL-1.2版本的东西。因此,opengl32.dll对于这些函数既不包含回退也不包含蹦床。相反,它充当代理,将调用传递给wglGetProcAddress到图形驱动程序(ICD)中的实际OpenGL实现。然而,由于不同的OpenGL上下文可以由不同的图形驱动程序(ICD)服务,因此结果可以是驻留在不同地址的符号。 wglGetProcAddress不会查看某些DLL的符号表,但可以在ICD认为合适的任何内容中实现。