我一直在阅读我所用的Visual Studio版本中包含的gl.h标头文件,但它似乎非常过时。
我不想使用GLUT或任何其他中间件/实用库来为我完成脏活,这包括GLEW。有人可以详细说明一下如何获取/查询4.0规范的现代特性集以及GLEW背后的思想是什么吗?
我一直在阅读我所用的Visual Studio版本中包含的gl.h标头文件,但它似乎非常过时。
我不想使用GLUT或任何其他中间件/实用库来为我完成脏活,这包括GLEW。有人可以详细说明一下如何获取/查询4.0规范的现代特性集以及GLEW背后的思想是什么吗?
在MSVC++中提供的gl.h仅涵盖Windows自带的opengl32.dll导出的功能。这个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。 这不是强制性的,而是因为这是最简单的方式。
你想访问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扩展的库,它的源代码非常简单明了(代码生成器则是另一回事)。因此,您可以看到如何加载扩展函数。
请使用SVN主干版本,而不是“发布”版本,因为我与作者合作添加了对OpenGL 4.x扩展的支持。
我喜欢GLee的原因是它只加载您使用的扩展,而GLEW会加载200多个不同的扩展,这会减慢程序启动速度,尤其是OpenGL分析速度。