【问题标题】:Loading OpenGL > 1.1 functions Windows加载 OpenGL > 1.1 函数 Windows
【发布时间】:2016-06-11 12:54:17
【问题描述】:

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

我要做的是加载较新的 OpenGL > 1.1 函数,例如 glBindBufferglBufferData。我已经读到可以使用wglGetProcAddress 获得指向函数的指针。使用此函数时,返回的指针始终为空,dll 中使用GetProcAddress(OpenGL32DLL, "...") 的所有原始函数都可以正常工作,但似乎没有加载较新的函数。

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

所以我们开始:

  • 我已经下载了 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:\Users\user\Desktop\gext\lib\gext.lib

  • CPP 文件包括:

C:\Program Files\Microsoft SDKs\Windows\v7.1\Include -> GL.h, GLU.h

C:\Users\user\Desktop\gext\include -> glcorearb.h, glext.h, wgext.h

【问题讨论】:

  • 您在调用wglGetProcAddress之前是否创建了OpenGL上下文?

标签: c++ windows opengl


【解决方案1】:

我建议您不要自己处理所有这些细节,而是自己获取一份 GLEW (http://glew.sourceforge.net/),它会以标准方式为您处理所有这些。我目前在几个已发布的产品上使用它没有问题。

在您的示例中,您可以执行以下操作:

if (GL_ARB_multi_bind) {
    //glBindBuffer is available.
}

(当然,在调用 glewInit() 之后,可能会使用 glewExperimental = TRUE; - 请参阅文档了解详细信息。)

【讨论】:

  • 您好,感谢您的评论。我知道 glew 库,但我很乐意在没有它的情况下这样做,因为这只是一个更大项目的一小部分,我想让一切尽可能轻量级。
  • @MircoProgram 老实说,这是一个仅包含标头的解决方案,因此您不会对性能、编译时间或二进制大小产生太大影响。您将确保您正确地做事,并且添加功能将是微不足道的。
  • @MikeWeir:GLEW 不是“仅标头”库(除非最近发生了变化)。现在,GLEW 也不是重量级组件,所以仍然没有正当理由使用它或其他加载库。
  • @NicolBolas 我可以相信你说它不仅仅是标题,但你能说明为什么你觉得它不能这样描述吗?取自en.wikipedia.org/wiki/Header-only 的定义似乎是准确的。据我所知,我只在使用这个库的项目中包含头文件。
  • @MikeWeir:GLEW 构建一个已编译的库文件,一个 .lib 或 .o 或其他文件。如果不包含此文件,您将无法使用 GLEW。
【解决方案2】:

使用此函数时,返回的指针始终为空,dll 中使用 GetProcAddress(OpenGL32DLL, "...") 的所有原始函数都可以正常工作,但似乎没有加载较新的函数。

您是否在调用线程上创建并使其成为当前有效的 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)
}

【讨论】:

    【解决方案3】:

    我认为问题在于调用 wglGetProcAddress 时没有当前上下文。

    函数指针可以特定于精确的像素格式,由 tge 上下文创建过程确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多