我在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)
答案 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。