是否可以链接到OpenGL> 1.1没有GL加载器的Windows?

时间:2014-01-22 06:15:45

标签: windows opengl dynamic-linking

如果我只使用glcorearb.h,我是否可以链接MSVC附带的1.1 OpenGL.lib中未提供的OpenGL函数?当我只包含标题(定义了GL_GLEXT_PROTOTYPES)并编译时,我得到了一堆未解析的外部,当我

#define GLAPI __declspec(dllimport)

我得到了一堆__imp__未解析的外部因素。这些符号究竟来自哪里? Dependency Walker在这里没有给我任何有用的东西。

如果我能这样做,我该如何在MSVC中进行设置?

我问,因为我不需要加载器提供的任何高级功能(即支持检测),但我确实需要现代的OpenGL。

2 个答案:

答案 0 :(得分:2)

您可以使用wglGetProcAddress()来解析符号:

glprofile.h:

#define APIENTRY __stdcall

extern GLuint (APIENTRY *glCreateShader_ptr)(GLenum);
#define glCreateShader glCreateShader_ptr
...

glprofile.c:

GLunint (APIENTRY *glCreateShader_ptr)(GLenum) = 0;
...

// Should be called after GL context creation
void initGl() {
    glCreateShader_ptr = (GLuint (APIENTRY *)(GLenum))wglGetProcAddress("glCreateShader");
    ...
}

这就是GLEW实际上做的事情。

答案 1 :(得分:2)

不,你需要一个“加载器”(GLEW或GLee,或者你编写/生成自己的东西)。它不会起作用。

GL_GLEXT_PROTOTYPES的存在确实表明你可以简单地“链接某些东西”,所以它只是有效,但事实并非如此,不要定义它(老实说,我不知道它存在于什么根本)。
必须在运行时解析符号既是OpenGL的祝福,也是诅咒,但你不会绕过它。最好的办法是不要浪费你的时间思考它,只需下载GLEW。它可以工作,你可以完成你的程序 如果GLEW过于膨胀或不够漂亮,你可以使用一个可用的“加载器生成器”,它生成一个特定的版本子集以及规范中的扩展,我认为Alfonse Reinhart在Github有一个。

如果您只需要5-6个功能,您也可以考虑手动加载它们(“编写您自己的加载器”),但是自己编写一个完全成熟的加载器(或加载器生成器)是巨大的浪费时间而不是一点都不正确(过去我已经做过了,所以我知道)。