如果我只是使用glcorearb.h
,我可以链接到OpenGL函数,这些函数不是在MSVC自带的1.1 OpenGL.lib
中提供的吗? 当我只是包含头(与GL_GLEXT_PROTOTYPES
定义)和编译,我得到了一堆未解决的外部,当我
#define GLAPI __declspec(dllimport)
我得到了一堆__imp__
未解决的外部。 这些符号来自哪里? 依赖沃克在这里没有给我任何有用的东西。
如果我能做到这一点,我如何设置它在MSVC?
我问,因为我不需要加载器提供的任何高级function(即支持检测),但我确实需要现代的OpenGL。
不,你需要一个“加载器”(GLEW或GLee,或者你写的/自己生成的东西)。 它不会工作。
GL_GLEXT_PROTOTYPES
的存在确实表明,你可以简单地“链接到某个东西”,所以它只是起作用,但事实并非如此,不要定义它(老实说,我不知道它存在的是什么)。
必须在运行时解析符号既是OpenGL的祝福也是诅咒,但是你不能绕过它。 最好的事情是不要浪费时间思考它,只需下载GLEW。 它的作品,你完成你的程序。
如果GLEW太臃肿或不够漂亮,你可以使用一个可用的“加载器生成器”,从规范中生成一个特定的版本和扩展子集,我认为Alfonse Reinhart在Github上有一个。
如果你只需要5-6个函数,你也可以考虑手动加载它们(“编写自己的加载器”),但是自己编写一个完全成熟的加载器(或者加载器生成器)是一个巨大的时间浪费,而且根本不重要(我过去做过,所以我知道)。
您可以使用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实际上做的。