加载OpenGL> 1.1功能Windows

时间:2016-06-11 12:54:17

标签: c++ windows opengl

我在使用MSVS 2013设置OpenGL时遇到问题。我知道Windows上的 opengl32.dll 位于C:\Windows\System32的平台是OpenGL 1.1的实现。

我想要做的是加载更新的OpenGL> 1.1 glBindBufferglBufferData等功能。我已经读过,可以使用wglGetProcAddress获取指向该函数的指针。使用此函数时,返回的指针始终为null,使用GetProcAddress(OpenGL32DLL, "...")的dll中的所有原始函数都可以正常工作,除了新函数似乎无法加载。

我希望这里的任何人都可以帮助我完成我的设置,并指出我做错了什么,或者我是否错过了什么。

所以我们走了:

  • 我已经下载了OpenGL Extensions Viewer 4.4,它指出我能够完美地运行到OpenGL 2.1 应该足以使用或加载glBindBufferglBufferData

  • 我下载了Microsoft SDKs / v7.1,其中包含标题:gl/glu.hgl/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

  • CPP文件包括:
  

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

3 个答案:

答案 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上下文创建过程确定。