我对Windows上的OpenGL 1.0和1.1函数指针的性质感到有些困惑。我想我已经失败了,但我不是百分百肯定,所以我希望有人能够确认或评论我目前的理解:
我目前的理解是,您应该使用wglGetProcAddress()
加载1.2+函数,但1.0和1.1函数必须通过GetProcAddress()
加载opengl32.dll
。然而,引起我注意的是,wglGetProcAddress()
应该返回不同的函数指针,具体取决于哪个HGLRC
上下文是当前的。然而,大概来自GetProcAddress()
的1.0和1.1指针始终是相同的。这种行为上的差异感觉很不寻常。
所以,让我们说我有多个HGLRC
个对象的情况,我们称之为A
和B
。我调用wglGetProcAddress()
并将结果保存在单独的指针池中,一个用于A
,另一个用于B
。然而,我还必须将1.0和1.1函数加载到这些指针池中,在这种情况下,似乎A
和B
的指针始终是相同的。
令我惊讶的是1.0和1.1函数因此必须是瘦包装器,它将OpenGL调用重定向到与当前HGLRC
相关联的任何驱动程序。然而,如果在Windows上已经存在这样的重定向机制,那么我想知道为什么wglGetProcAddress()
也不能使用它,因为这样做会减轻它返回依赖于上下文的指针的危险。我甚至不需要知道这个问题的答案,但问题的出现让我想知道我是否开始正确理解事情。
答案 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认为合适的任何内容中实现。