GLEW 对于最新的 OpenGL 应用程序是否是强制性的



我一直在阅读我的Visual Studio版本中包含的gl.h头文件,它似乎已经过时了。

不希望 GLUT 或介于两者之间的任何其他中间件/实用程序库为我做肮脏的工作,包括 GLEW。有人可以详细说明为什么以及如何获取/查询 4.0 规范的现代功能集以及 GLEW 背后的想法是什么?

MSVC++ 附带的 gl.h 仅涵盖 opengl32 导出的功能.dll随 Windows 一起提供。这个DLL大多只是一个所谓的"蹦床"进入实际的驱动程序。但它只导出一个非常旧的OpenGL版本,即OpenGL-1.1。

除此之外的任何功能都必须通过扩展机制进行访问。

不希望 GLUT 或介于两者之间的任何其他中间件/实用程序库为我做肮脏的工作,包括 GLEW。

GLUT与GLEW完全无关

有人可以详细说明为什么以及如何获取/查询 4.0 规范的现代功能集以及 GLEW 背后的想法是什么?

您可以通过已经提到的扩展系统获得现代功能集。

有一个功能?glGetProcAddress(确切名称取决于操作系统环境,在 Windows wglGetProcAddress 中(。使用此函数,您可以检索指向当前 OpenGL 上下文的扩展过程的函数指针(在 GLX 中,所有上下文的函数指针都相同,但在 Windows 中它们可能不同(。

加载扩展是这样的:

typedef (*OGLEXTP_SOMEEXTENSIONFUNCTION)(...)
OGLEXTP_SOMEEXTENSIONFUNCTION oglextp_glSomeExtensionFunction = NULL;
#define glSomeExtensionFunction oglextp_glSomeExtensionFunction;

struct Extensions
{
    bool SomeExtensionFunction;
}
errorcode initGLExtensions(){
    Extensions available;
    GLubyte extensions = glGetStrings(GL_EXTENSIONS);
    parse_extension_string(extensions, available);
    if( available.SomeExtensionFunction ) {
        oglextp_glSomeExtensionFunction = wglGwtProcAddress("glSomeExtensionFunction");
        if( !oglextp_glSomeExtensionFunction )
             return errorcode;
    }
}

你必须为每个函数编写大量的代码。没有人愿意写这个。因此,GLEW的开发人员提出了一组脚本,这些脚本从 opengl.org 获取扩展规范,并自动创建整个扩展加载并将其包装到一个小库中,而不会创建额外的依赖项。

如果您想使用更高的 OpenGL 功能:请使用 GLEW。不是因为它是强制性的,而是因为它是最直接的方法。

不要害怕 GLEW。首先,我实际上已经看到了 GLEW 在 Nvidia OpenGL SDK 示例中的使用。它显然是一个具有友好许可证的可靠工具。其次,您可以静态链接库并将其作为依赖项蒸发。(就个人而言,我只是将源代码添加到我的项目中,并 #define GLEW_STATIC 使其工作。

你想访问OpenGL 4.0扩展吗?您可能需要创建一个 OpenGL 4.0 上下文并要求 GLEW 绑定相应的函数。

这是从我的项目中复制的GLEW和GLFW的示例。

  ...
  if (!glfwInit()) {
    exit(EXIT_FAILURE);
  }
  glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 2);   // I requested OpenGL 2.1 context
  glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 1);
  if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) {  // get OpenGL context
    glfwTerminate();
    exit(EXIT_FAILURE);
  }
  if (glewInit() != GLEW_OK) {   // init glew, and bind gl* Extension functions
    glfwTerminate();
    exit(EXIT_FAILURE);
  }
  // now gl* extensions is available here
  ....

> GLee是另一个用于加载OpenGL扩展的库,它非常简单易懂的源代码(代码生成器是另一回事(。 因此,您可以看到加载扩展函数的工作原理。

  • 首页: http://elf-stone.com/glee.php
  • 关于 OpenGL.org 的描述:http://www.opengl.org/sdk/libs/GLee/
  • 维基百科上的描述:http://en.wikipedia.org/wiki/OpenGL_Easy_Extension_library

请使用SVN主干,而不是"发布"版本,因为我与作者一起添加了对OpenGL 4.x扩展的支持。

我喜欢GLee的地方在于它只加载您使用的扩展,而GLEW加载了200 +不同的扩展,这减慢了程序启动速度,尤其是减慢了OpenGL分析的速度。

最新更新