如果我只使用glcorearb.h
,我是否可以链接MSVC附带的1.1 OpenGL.lib
中未提供的OpenGL函数?当我只包含标题(定义了GL_GLEXT_PROTOTYPES
)并编译时,我得到了一堆未解析的外部,当我
#define GLAPI __declspec(dllimport)
我得到了一堆__imp__
未解析的外部因素。这些符号究竟来自哪里? Dependency Walker在这里没有给我任何有用的东西。
如果我能这样做,我该如何在MSVC中进行设置?
我问,因为我不需要加载器提供的任何高级功能(即支持检测),但我确实需要现代的OpenGL。
答案 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个功能,您也可以考虑手动加载它们(“编写您自己的加载器”),但是自己编写一个完全成熟的加载器(或加载器生成器)是巨大的浪费时间而不是一点都不正确(过去我已经做过了,所以我知道)。