我一直在阅读我的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分析的速度。