我可以将opengl扩展指针设为全局吗?

时间:2016-08-06 10:15:52

标签: c++ opengl

使用opengl / windows 10 / visual c ++ 2015

我有一个' Window'在我的程序中创建并维护一个win32屏幕窗口,包括制作一个现代的' opengl上下文就可以了。作为这样做的一部分,它获得了许多opengl'扩展'功能

我的问题是我可以将这些扩展指针全局/类静态存储,还是我需要为每个实例或Window保留一份副本,因为它们会有不同的opengl上下文?对于我创建的每个opengl上下文,指针是否有效且相同?我需要为我创建的每个窗口反复执行它吗?

2 个答案:

答案 0 :(得分:4)

  

对于我创建的每个opengl上下文,指针是否有效且相同?我需要为我创建的每个窗口反复执行它吗?

这取决于所使用的操作系统和窗口系统。 WGL specification says,OpenGL扩展函数指针允许每个OpenGL上下文不同:

  

wglGetProcAddress()

     

...

     

<强>说明

     

OpenGL库支持其功能的多个实现。   一个渲染上下文中支持的扩展函数不是   必须在单独的渲染上下文中可用。因此,对于   给定应用程序中的渲染上下文,使用函数地址   仅由wglGetProcAddress函数返回。

X11/GLX specifies (page 35, section 3.3.12)相反,OpenGL扩展函数指针不管上下文如何都是不变的(即不要改变):

  

glXGetProcAddress返回的GL函数指针独立于当前绑定的上下文,并且可以由支持扩展的任何上下文使用。

对于Windows,最可行的方法是在上下文句柄和包含所有函数指针的结构之间建立映射,即

struct glfunctions {
    /* all the function pointers */
};
std::map<HGLRC,glfunctions> context_glfunctions;

随意将某种形式的LRU添加到地图中,以便重复查找上下文不必遍历整个地图。

答案 1 :(得分:-1)

我无法理解为什么你认为复制指针会有所不同?没关系,因为指针性质,如果你复制它们,你会得到几个指向同一个函数的不同指针 - 它们不会指向另一个函数,因此你可以将它们全局存储为ether或作为静态成员存在一类。无论