OpenGL文件glew.h和gl.h / glu.h之间的区别

时间:2012-08-25 14:00:38

标签: opengl glut glew

我已经构建了一个opengl程序,我的glu和gl头文件默认包含在windows 7专业版中。现在,我买了一本描述OpenGL游戏开发的书。本书的作者说,我必须将glew标题包含在我的项目中。在我完成此操作后,我得到了一些未解决的外部符号错误。

所以,现在我真的很困惑。 我之前在我的程序中使用了glBegin和glEnd语句。现在我要使用glBindBuffers和glGenBuffer等,但我得到了未解决的外部符号错误,如:

1>cWindows.obj : error LNK2001: unresolved external symbol __imp___glewBindBuffer
1>cMdlLoader.obj : error LNK2001: unresolved external symbol __imp___glewBindBuffer
1>cMdlLoader.obj : error LNK2001: unresolved external symbol __imp___glewBufferData
1>cMdlLoader.obj : error LNK2001: unresolved external symbol __imp___glewGenBuffers

这里的任何人都可以解释这个头文件与我使用它之间的区别吗?

我愣了很多时间,但在不同的网站上有更多令人困惑的词,比如“欢乐合唱团”或“过剩”。

2 个答案:

答案 0 :(得分:43)

你在这里混合了三件不同的东西:

  1. 的OpenGL
  2. 不属于OpenGL的GL Utilities(GLU)
  3. 和GL Extension Wrangler(GLEW)
  4. GLEW和GLU是完全不同的东西,你不能替换另一个。

    GL/gl.h是基本的OpenGL标题,它为您提供OpenGL-1.1函数和标记声明,任何可能更多。对于超出1.1版的任何内容,您必须使用OpenGL扩展机制。由于这是一项枯燥乏味的任务,因此GLEW项目实现了自动化,该项目提供了一个易于使用的库中包含的所有脏信息。该库的声明可在头文件GL/glew.h中找到。由于OpenGL扩展在没有基本OpenGL的情况下没有意义,因此GLEW标头隐式包含常规OpenGL标头,因此包含GL/glew.h时您不再需要包含GL/gl.h

    然后是GLU,一组便利方法,BTW严重过时,不应该在任何现代OpenGL程序中使用。没有现代化的GLU,所以请忘记它。无论如何,它的声明是由标题GL/glu.h(你要问的那个)提供的。

    您获得的错误与包含文件无关。那些是链接器错误。仅包括声明只是工作的一半。另一半是链接实际的定义,而那些不在库文件的标题中; Windows上的* nix操作系统libglew.solibglew.aglew.libglew32.lib上的glews.libglew32s.lib。如果不使用静态版本(那些没有's'的版本),你也必须安装正确的DLL。

    因此,要使用GLEW,您需要包含标题将其添加到链接器选项中的库列表中。此外,一旦在程序中获得了OpenGL上下文,就必须调用glewInit();

答案 1 :(得分:22)

  • gl :这是OpenGL 1.1版的基本头文件。这意味着如果您想使用1.1版以外的任何功能,则必须在此添加任何扩展库。
  • glew :OpenGL扩展牧马人库。这是一个用于加载OpenGL扩展功能的跨平台库。初始化此库时,它将在运行时检查您的平台和图形卡,以了解程序中可以使用的功能。
  • glu :这是OpenGL实用程序库,很长时间没有更新。不需要使用此头文件。
  • 过剩:用于Windowing API的OpenGL实用工具包。这适用于中小型OpenGL程序。如果您需要更复杂的窗口库,请使用GTK或Qt等本机窗口系统工具包来处理Linux机器。
  • glfw :OpenGL框架工作。另一个用于创建窗口和处理事件的多平台库。 FreeGlut可以作为替代品。 glfw专为游戏开发而设计。
  • glm :OpenGL数学。它有助于实现向量和矩阵运算。

我对OpenGL很新,所以如果我错了请纠正我。