在没有GL加载程序库的情况下,是否可以在Windows上链接OpenGL>1.1?
如果我只使用glcorearb.h,我可以链接MSVC附带的1.1 OpenGL.lib中没有提供的OpenGL函数吗?当我只包含定义并编译了GL_GLEXT_原型的头文件时,我得到了一堆未解析的外部文件,当我在没有GL加载程序库的情况下,是否可以在Windows上链接OpenGL>1.1?,windows,opengl,dynamic-linking,Windows,Opengl,Dynamic Linking,如果我只使用glcorearb.h,我可以链接MSVC附带的1.1 OpenGL.lib中没有提供的OpenGL函数吗?当我只包含定义并编译了GL_GLEXT_原型的头文件时,我得到了一堆未解析的外部文件,当我 #define GLAPI __declspec(dllimport) 我得到了一堆未解决的外部问题。这些符号从何而来?依赖沃克在这里没有给我任何有用的东西 如果我能做到这一点,我该如何在MSVC中设置它 我这样问是因为我不需要加载程序提供的任何高级功能,即支持检测,但我需要现代Ope
#define GLAPI __declspec(dllimport)
我得到了一堆未解决的外部问题。这些符号从何而来?依赖沃克在这里没有给我任何有用的东西
如果我能做到这一点,我该如何在MSVC中设置它
我这样问是因为我不需要加载程序提供的任何高级功能,即支持检测,但我需要现代OpenGL。您可以使用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实际上就是这样做的。您可以使用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实际所做的。不,您需要一个加载程序GLEW或GLee,或者您自己编写/生成的东西。否则就不行了 GL_-GLEXT_原型的存在确实表明,您可以简单地链接到某个东西,这样它就可以正常工作,但事实并非如此,请不要诚实地定义它,我根本不知道它的存在是为了什么。 必须在运行时解析符号对于OpenGL来说是一件好事,也是一件坏事,但你不能回避它。最好的办法是不要浪费时间去想它,只需下载GLEW。它可以工作,你可以完成你的程序。 如果GLEW过于臃肿或不够漂亮,您可以使用一个可用的loader生成器,它根据规范生成特定的版本子集和扩展,我认为Alfonse Reinhart在Github有一个
<5>如果你只需要5-6个函数,你可以考虑手动加载它们,也可以编写自己的加载器,但是自己编写一个完全的加载器或加载程序生成器是一个巨大的浪费时间,而且根本不需要做正确的事情,我过去已经这么做了,所以我知道。 < P>不,你需要一个加载器GLW或GLee,或者你自己写/生成的东西。否则就不行了 GL_-GLEXT_原型的存在确实表明,您可以简单地链接到某个东西,这样它就可以正常工作,但事实并非如此,请不要诚实地定义它,我根本不知道它的存在是为了什么。 必须在运行时解析符号对于OpenGL来说是一件好事,也是一件坏事,但你不能回避它。最好的办法是不要浪费时间去想它,只需下载GLEW。它可以工作,你可以完成你的程序。 如果GLEW过于臃肿或不够漂亮,您可以使用一个可用的loader生成器,它根据规范生成特定的版本子集和扩展,我认为Alfonse Reinhart在Github有一个
如果你只需要5-6个函数,你可以考虑手动加载它们,也可以编写自己的加载器,但是自己编写一个完全的加载器或者一个加载器生成器是一个巨大的浪费时间,而且根本不需要做正确的事情,我过去已经这么做了,所以我知道。他们几乎都是脑死的。他们所做的只是检查扩展字符串并加载支持的每个扩展。实际上,GLEW非常愚蠢,以至于在核心概要文件上下文中,它甚至无法检查扩展字符串。它只是尝试加载它知道的每个扩展,这就是glewExperimental实际所做的,如果成功,它会认为您的实现支持该扩展。加载程序不提供任何高级功能,它们实际上都是死板的。他们所做的只是检查扩展字符串并加载支持的每个扩展。实际上,GLEW非常愚蠢,以至于在核心概要文件上下文中,它甚至无法检查扩展字符串。它只是尝试加载它知道的每个扩展,这就是glewExperimental实际做的事情,如果成功,它会认为您的实现支持该扩展。