无法在DLL“opengl32.dll”中找到名为“glCreateShader”的入口点

时间:2011-07-03 08:28:29

标签: opengl

我在OpenGL工作 Tao Bindings。
XP Pro 64.
VS.NET 2008在VB.NET中 我已经构建了许多简单的工具和测试应用程序,甚至还有2个使用Opengl进行渲染的大型应用程序。

为什么我只在一个项目中同时在运行时看到这个?它构建没有错误..这对于这种事情是正常的。事情是,它只是这个灵魂,我正在努力解决这个问题。

  

无法在DLL“opengl32.dll”中找到名为“glCreateShader”的入口点。

我已经尝试在IDE中更改各种设置(但是它与其他代码一起工作很精致,因此这些东西很难用!)

我已经尝试更换了opengl32.dll但是..然后没有构建的解决方案会运行。

1)这不是opengl32.dll(在其他版本中工作正常)
2)VS2008中的设置与我构建的任何其他OpenGL应用程序相同 3)我已经查看了几个小时的代码,甚至搜索过看看这些变量名称是否是偶然使用的方式。我看不到任何可能导致这种情况的事 4)是..我正在编译到x86(陶不会在64位运行)..正如我所提到的......直到现在我都没有问题。

这是抗议的路线:

    vertexObject = Gl.glCreateShader(Gl.GL_VERTEX_SHADER)

3 个答案:

答案 0 :(得分:3)

好的人......我发现了问题。

如果我不确定在Win的所有版本中都是如此,但对于XP Pro 64 ...

将屏幕更改为完整尺寸会导致Tao松开方向。

来自道类中的文字:

此类包含2.1规范中定义的所有OpenGL枚举和函数。官方.spec文件可在以下位置找到:http://opengl.org/registry/。 我们依靠静态初始化来获取OpenGL函数的入口点。在调用任何OpenGL函数之前,请确保在相关线程中使有效的OpenGL上下文成为当前(GLUT,SDL或GLFW等工具包将自动处理上下文初始化过程)。如果没有有效的OpenGL上下文,我们将只能检索静态导出的入口点(通常对应于Windows下的OpenGL 1.1版,Linux下的1.3和Windows Vista下的1.4),并且需要手动加载扩展方法。*

如果您希望对扩展加载有更多控制权,可以使用ReloadFunctions或ReloadFunction方法手动强制初始化OpenGL入口点。每当您调用ReloadFunctions方法时都应该调用更改现有的视觉或像素格式。当您更改与窗口关联的颜色/模板/深度缓冲区(但可能不是分辨率)时,通常会发生这种情况。这在Linux / MacOS下可能是必需的,也可能不是必需的,但Windows通常是必需的。

我确信以上是(c)by Tao ..

我很抱歉如果我听起来脾气暴躁......我是:(

无论如何..我需要添加这个....

<强> Gl.ReloadFunctions()

....设置设备上下文后。

所以这是现在有效的订单:

    If Not (Wgl.wglMakeCurrent(ghDC, hRC)) Then
        MessageBox.Show("Unable to make rendering context current")
        End
    End If
    Glut.glutInit()
    Glut.glutInitDisplayMode(GLUT_RGBA Or GLUT_DOUBLE)
    Gl.ReloadFunctions() 'New Line that reloads the extensions. 
    build_shaders() ' where shaders are created and complied

所以你有它:)

再次感谢大家!

答案 1 :(得分:1)

glCreateShader是OpenGL-2引入的函数,之前是扩展的一部分。 Windows的opengl32.dll仅涵盖OpenGL-1.1,除此之外的任何东西只能作为扩展名访问。因此,必须通过exension机制检索glCreateShader的入口点。 OpenGL.org有一个关于此的常见问题

http://www.opengl.org/resources/faq/technical/extensions.htm

  

23.070如何在Microsoft Windows上调用扩展例程?

     

您   应用可能会找到一些扩展   已经可以通过微软获得   opengl32.lib。但是,取决于   您的OpenGL设备和设备驱动程序,   特定于供应商的扩展   链接可能存在也可能不存在   时间。如果它不存在   opengl32.lib,你需要获得   扩展名条目的地址   从设备运行时指向   ICD。这是一个示例代码段   这证明了获得功能   ARB_multitexture的指针   扩展:

/* Include the header that defines the extension. This may be a
   vendor-specific .h file, or GL/glExt.h as shown here, which
   contains definitions for all extensions. */
#include "GL/glExt.h"

/* Declare function pointers */
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;

...
    /* Obtain the address of the extension entry points. */
    glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)
        wglGetProcAddress("glActiveTextureARB");
    glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)
        wglGetProcAddress("glMultiTexCoord2fARB");
     

获取扩展功能的入口点地址后   你想使用它,只需通过它们作为正常的函数指针调用:

    /* Set texture unit 0 min and mag filters */
    (*glActiveTextureARB) (GL_TEXTURE0_ARB);
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
...
    /* Draw multi textured quad */
    glBegin (GL_QUADS);
      (*glMultiTexCoord2fARB) (GL_TEXTURE0_ARB, 0.f, 0.f);
      (*glMultiTexCoord2fARB) (GL_TEXTURE1_ARB, 0.f, 0.f);
        glVertex3f (32.f,32.f, 0.f);
 ...

glEnd();
     

更多信息   wglGetProcAddress()可用   通过MSDN文档。

在语言绑定的情况下,如Tao或OpenTK,正确设置和提供所有可用的扩展是绑定的工作。现在你正在使用 Tao ,这是非常过时的(最后一个版本是2005年11月)。我建议切换到OpenTK

答案 2 :(得分:0)

我首先使用'nm'和'objdump -CDx'来检查函数是否已定义并包含代码。

dumpbin /symbols library.lib

然后我会核实

FARPROC WINAPI GetProcAddress(
  __in  HMODULE hModule,
  __in  LPCSTR lpProcName
);

实际上可以找到函数指针 如果要弄清楚错误是什么,请使用GetLastError。