GLEW 做啥,我为啥需要它?
Posted
技术标签:
【中文标题】GLEW 做啥,我为啥需要它?【英文标题】:What does GLEW do and why do I need it?GLEW 做什么,我为什么需要它? 【发布时间】:2013-07-22 11:11:57 【问题描述】:好的,所以我已经知道为什么需要 GLEW,但只是在一定程度上。
如果我使用现代 OpenGL 的东西,可能从 3.0 版开始,和/或使用核心配置文件,则需要 GLEW,因为没有它编译会产生错误,例如未声明 glGenVertexArrays
。
所以 GLEW 做了一些后台工作,包括我们可能想要使用的现代 OpenGL 函数。
除此之外,它还有其他作用吗?还有,它是如何工作的。
例如,它是否改进了跨平台编译? (例如,如果从 Linux 迁移到 Windows 或 OS X,则需要对代码进行较少的修改?
它是否也改进了图形硬件的“跨平台性”?例如,假设我们有两台相同的计算机,包括操作系统。在一个系统上使用 OpenGL 4.3 命令编译程序。如果其他系统的显卡或驱动程序仅支持 OpenGL 3.3,GLEW 是否有帮助? (也许是为旧版本的 OpenGL 编译着色器?)
所以你可能会看到我实际上并不知道 GLEW 是做什么的或它是如何做到的。
最后一点;有谁知道如何将 GLEW 与 GLFW 一起使用?实际上,我可能会将其作为一个单独的问题发布。
【问题讨论】:
【参考方案1】:正如您所说,GLEW 不是“必需的”。您可以使用 glcorearb.h 标头或类似的东西。但是,如果您链接某些功能 - 它必须存在于目标平台上,否则您的程序将无法启动。 GLEW 和其他人正是为了处理这个问题——您不是直接与 GL 函数链接,而是在初始化阶段之后获取函数指针。它允许您在运行时检查存在哪些扩展以及可以使用哪些功能。
它对可移植性的唯一帮助是获取函数指针——它可能是 wglGetProcAddress/glxGetProcAddress,它是苹果操作系统的模拟。所以不,这不是一个案例。但是,可用的 GL 扩展种类繁多。
GLEW 不需要与您首选的 GL 初始化库接触点 - 只需在创建 GL 上下文后调用 glewInit。
【讨论】:
如果我创建一个窗口然后调用 glewInit() 我得到一个段错误? @EdwardBird:您是否在该窗口上创建了 OpenGL 上下文?调用 glewInit 时 OpenGL 上下文是否处于活动状态? 是的,我做到了,但我现在已经解决了问题 - 无论如何谢谢(:【参考方案2】:要正确初始化 glew,必须创建一个 OpenGL 上下文并且必须在调用 glewInit();
之前调用 wglMakeCurrent()
我会将其放入 keltar 答案的 cmets 中,但我不知道如何。
【讨论】:
为什么需要wglMakeCurrent()
?这是特定于平台还是每个操作系统都需要它?
它是特定于窗口的,它是为了使渲染上下文处于活动状态,以便您可以调用 gl 命令而不会出错
所以我认为 linux 或 OS X 可能不需要它?顺便说一句,令人印象深刻的响应速度。
他们都有自己的版本以上是关于GLEW 做啥,我为啥需要它?的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使在搜索路径中列出了 GLEW 动态库,Xcode 也无法找到它?
FormControl 是做啥用的?为啥使用它?应该如何使用?
Navigation Drawer - syncState() 做啥以及为啥应该在 onPostCreate() 中调用它?