我正在尝试将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上的真实实现?
答案 0 :(得分:8)
答案 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扩展的所有繁琐工作,并将它们提供给最终用户。