无法将OpenGL应用程序移植到Windows

时间:2009-03-24 20:28:54

标签: c++ windows visual-studio opengl

我正在尝试将OpenGL应用程序移动到Windows。

据我了解,Windows有一个不错的OpenGL实现。但我开始认为它没有......

具体来说,我使用数组缓冲区和glDrawArrays

当我尝试在Visual Studio 2008 Pro中编译代码时,我收到以下错误:

vertexbuffers.cpp(31) : error C3861: 'glGenBuffers': identifier not found
vertexbuffers.cpp(32) : error C2065: 'GL_ARRAY_BUFFER' : undeclared identifier
vertexbuffers.cpp(32) : error C3861: 'glBindBuffer': identifier not found
vertexbuffers.cpp(33) : error C2065: 'GL_ARRAY_BUFFER' : undeclared identifier
vertexbuffers.cpp(33) : error C2065: 'GL_STATIC_DRAW' : undeclared identifier
vertexbuffers.cpp(33) : error C3861: 'glBufferData': identifier not found

当我检查<GL\gl.h>(包含在C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\gl中)时,我看到了:

/* ClientArrayType */ 
/*      GL_VERTEX_ARRAY */
/*      GL_NORMAL_ARRAY */
/*      GL_COLOR_ARRAY */

更新但似乎这些内容会在别处定义。

如果我无法访问这些功能,我应该如何生成缓冲区?

文档未说明这些数组类型已被禁用。如何在Windows上访问OpenGL上的真实实现?

4 个答案:

答案 0 :(得分:8)

你可能会给GLEW一个机会:

http://glew.sourceforge.net/

我很确定我在过去的某个时间使用它,并且使这种事情变得更容易和更便携。

答案 1 :(得分:6)

除非重复,否则#defines会在头文件中注释掉。看看gl.h的第1054行:

/* vertex_array */
#define GL_VERTEX_ARRAY                   0x8074

如果实际上缺少#define,那么您应该用新副本替换该文件。

如果查看the documentation for glGenBuffers,您会发现它仅适用于OpenGL 1.5及更高版本。 Windows的头文件仅附带OpenGL 1.2,您应该使用扩展机制来访问较新的功能。如果您使用函数名称调用wglGetProcAddress,例如

void (__stdcall *glGenBuffers)(GLsizei,GLuint*) =
    wglGetProcAddress("glGenBuffers");

然后你有一个指向该函数的指针。

答案 2 :(得分:2)

似乎缓冲区函数仅作为扩展方法在Windows上可用。

OpenGL提供glext.h声明指向所有这些函数的指针。然后我的应用程序使用wglGetProcAddress来获取指向函数的指针。

例如:

PFNGLGENBUFFERSPROC myglBindBuffers = 
    (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffersARB");

谢天谢地,我只需要为大约4个功能做这件事。不幸的是,我现在必须在我的应用程序中添加与平台相关的代码。

答案 3 :(得分:1)

微软对OpenGL的支持只延伸到OpenGL-1.1到Windows XP,以及从Vista开始的OpenGL-1.4。超出这些功能的任何OpenGL功能必须由可安装客户端驱动程序(ICD)提供和支持,即GPU驱动程序的OpenGL实现。为了访问高级功能,OpenGL提供了所谓的扩展系统,它由 wglGetProcAddress 组成,类似于 GetProcAddress 的DLL,但是给出了访问OpenGL实现的功能(=驱动程序)。

为了简化操作,我们开发了很好的包装库,如GLEW,它可以完成初始化所有可用OpenGL扩展的所有繁琐工作,并将它们提供给最终用户。