我在使用MSVS 2013设置OpenGL时遇到问题。我知道Windows上的 opengl32.dll
位于C:\Windows\System32
的平台是OpenGL 1.1的实现。
我想要做的是加载更新的OpenGL> 1.1 glBindBuffer
和glBufferData
等功能。我已经读过,可以使用wglGetProcAddress
获取指向该函数的指针。使用此函数时,返回的指针始终为null,使用GetProcAddress(OpenGL32DLL, "...")
的dll中的所有原始函数都可以正常工作,除了新函数似乎无法加载。
我希望这里的任何人都可以帮助我完成我的设置,并指出我做错了什么,或者我是否错过了什么。
所以我们走了:
我已经下载了OpenGL Extensions Viewer 4.4,它指出我能够完美地运行到OpenGL 2.1
应该足以使用或加载glBindBuffer
和glBufferData
。
我下载了Microsoft SDKs / v7.1,其中包含标题:gl/glu.h
和gl/gl.h
;我还下载了GLEXT扩展API
来自here,并将glext.lib
+与标题相关联。
链接器中的文件:
C:\ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Lib \ OpenGL32.Lib
C:\ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Lib \ GlU32.Lib
C:\用户\用户\桌面\ glext \ lib中\ glext.lib
C:\ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Include - > GL.h,GLU.h
C:\ Users \ user \ Desktop \ glext \ include - > glcorearb.h,glext.h,wglext.h
答案 0 :(得分:5)
我建议您不要自己处理所有这些细节,而是抓住自己的GLEW(http://glew.sourceforge.net/)副本,它以标准方式为您处理所有这些问题。我目前在几个已发布的产品上使用它没有问题。
在您的示例中,您可以执行以下操作:
if (GL_ARB_multi_bind) {
//glBindBuffer is available.
}
(当然,在致电glewInit()
之后,可能会glewExperimental = TRUE;
- 请参阅文档了解详情。)
答案 1 :(得分:1)
当使用此函数时,返回的指针始终为null,使用GetProcAddress(OpenGL32DLL," ...")的dll中的所有原始函数都可以正常工作,除了新函数看起来不像加载。
您是否在调用线程上创建了有效的OpenGL上下文并使其成为最新的?在Windows中,扩展函数在技术上是每个上下文,即你必须获得指向你创建的每个OpenGL上下文的函数的指针,并确保使用正确的函数指针和正确的上下文。
这当然也意味着您必须首先拥有OpenGL上下文。在Windows中设置OpenGL上下文的通常顺序是:
伪代码
struct glctx {
HGLRC rc
// dictionary for explanation purposes
// one would normally just have a bunch of
// structure elements here
functionpointer[string:name] extensionfunction
}
if not window_with_desired_pixelformat_exists: {
wnd := create_a_window
pixelformat := select_pixelformat
wnd→set_pixelformat pixelformat
}
dc := wnd→getDC
glctx ctx
ctx→rc := wglCreateContext(dc)
wglMakeCurrent(dc, ctx→rc);
foreach(fname in extensionfunctions_names): {
ctx→extensionfunction[name] = wglGetProcAddress(name)
}
答案 2 :(得分:0)
我认为问题在于调用wglGetProcAddress时没有当前上下文。
函数指针可以特定于精确的像素格式,由tge上下文创建过程确定。