Opengl GLFW加载函数

Opengl GLFW加载函数,opengl,glfw,Opengl,Glfw,从Opengl wiki: OpenGL初始化分为两个阶段。第一阶段是 创建OpenGL上下文;第二阶段是加载所有 使用OpenGL所必需的函数 这个样板工作是通过各种OpenGL加载库完成的 因此,我下载了GLFW,并在库中编译了演示测试。但是发现框架将窗口创建和上下文创建合并为一个函数调用createWindow,在这个函数调用中,它首先创建一个窗口和一个上下文,然后通过initWGLExtensions加载一些扩展函数 因此,现在可以设置上下文,而无需加载任何其他gl函数。简单的演示然后启

从Opengl wiki:

OpenGL初始化分为两个阶段。第一阶段是 创建OpenGL上下文;第二阶段是加载所有 使用OpenGL所必需的函数

这个样板工作是通过各种OpenGL加载库完成的

因此,我下载了
GLFW
,并在库中编译了演示测试。但是发现框架将窗口创建和上下文创建合并为一个函数调用
createWindow
,在这个函数调用中,它首先创建一个窗口和一个上下文,然后通过
initWGLExtensions
加载一些扩展函数

因此,现在可以设置上下文,而无需加载任何其他gl函数。简单的演示然后启动一个msg循环来绘制

int main(void)
{
    GLFWwindow* window;

    glfwSetErrorCallback(error_callback);

    if (!glfwInit())
        exit(EXIT_FAILURE);

    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    glfwSetKeyCallback(window, key_callback);

    while (!glfwWindowShouldClose(window))
    {
        float ratio;
        int width, height;

        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;

        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);

        glLoadIdentity();
        glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);

        glBegin(GL_TRIANGLES);
        glColor3f(1.f, 0.f, 0.f);
        glVertex3f(-0.6f, -0.4f, 0.f);
        glColor3f(0.f, 1.f, 0.f);
        glVertex3f(0.6f, -0.4f, 0.f);
        glColor3f(0.f, 0.f, 1.f);
        glVertex3f(0.f, 0.6f, 0.f);
        glEnd();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);

    glfwTerminate();
    exit(EXIT_SUCCESS);
}
那么所有的渲染命令函数都是动态的?它实际上是在
GL.h
中声明的。因此,由于框架没有从驱动程序加载这些函数。这些职能部门驻留在哪里?[问题]

GLFW
加载的所有函数如下

src\wgl_context.h(39):typedef PROC (WINAPI * WGLGETPROCADDRESS_T)(LPCSTR);
src\wgl_context.h(44):#define _glfw_wglGetProcAddress _glfw.wgl.opengl32.GetProcAddress
src\wgl_context.h(89):        WGLGETPROCADDRESS_T GetProcAddress;
src\wgl_context.c(42):        _glfw_wglGetProcAddress("wglGetExtensionsStringEXT");
src\wgl_context.c(44):        _glfw_wglGetProcAddress("wglGetExtensionsStringARB");
src\wgl_context.c(48):        _glfw_wglGetProcAddress("wglCreateContextAttribsARB");
src\wgl_context.c(52):        _glfw_wglGetProcAddress("wglSwapIntervalEXT");
src\wgl_context.c(56):        _glfw_wglGetProcAddress("wglGetPixelFormatAttribivARB");
src\wgl_context.c(289):    _glfw.wgl.opengl32.GetProcAddress = (WGLGETPROCADDRESS_T)
src\wgl_context.c(290):        GetProcAddress(_glfw.wgl.opengl32.instance, "wglGetProcAddress");
src\wgl_context.c(659):    const GLFWglproc proc = (GLFWglproc) _glfw_wglGetProcAddress(procname);
这是否意味着我不需要加载任何其他GL函数?[[问题]] 只是有点混淆了总账的工作流程

更新


找出那些gl函数调用链接到
opengl32.lib
。这是什么意思?我是否使用windows10默认的1.1 gl实现?所以,实际上我不需要从一个实际的驱动程序导出这些函数,比如说
nvoglv32.dll​opengl32.lib
中使用一个静态链接?

OpenGLWiki中的措辞有点不吉利。细节有点复杂。OpenGL环境有三个方面:

  • 操作系统ABI(应用程序二进制接口)合同
  • OpenGL上下文
  • 窗口系统集成
从历史上看,OpenGL与操作系统集成的方式是一种粗糙的黑客行为,只有一个设计拙劣的界面:因为OpenGL是一个设计用于与图形驱动程序对话的API,所以您不能安装第三方库的kine。操作系统必须提供一组特定的接口。ABI合同中明确规定了这些接口的具体内容。当然,每个操作系统都有自己的契约,甚至可能在不同版本之间发生变化

为了支持OpenGL的更新版本,定义了所谓的“扩展机制”,通过它可以加载ABI契约之外的函数。作为ABI合同一部分的功能也可能通过该机制提供,也可能不通过**提供,因此不要依赖于该假设

在Windows(从Win-NT-4和Win-95B起)中,ABI合同保证,程序将始终找到符合标准的OpenGL-1.1实现。为了简单起见,OpenGL-1.1入口点由接口存根库(opengl32.dll,符号表可通过opengl32.lib获得)直接公开,仅此而已。然后,设备驱动程序通过OpenGL实现的末端连接到存根库,与硬件对话。对于所有OpenGL上下文,OpenGL-1.1存根都是不变的,即它们对于所有上下文都是相同的。OTOH的扩展功能特定于每个上下文。因此,对于创建的每个OpenGL上下文,必须单独加载扩展函数指针,并在调用时与活动上下文正确匹配。这还意味着,您必须先创建一个上下文(并使其处于活动状态),然后才能尝试加载其扩展函数

在X11/GLX环境(例如Linux、*BSDs、Solaris)中,情况如下:ABI合同规定,如果OpenGL可用,则OpenGL实现共享对象必须至少导出OpenGL-1.2的功能。这是特别值得注意的!在Windows上有一些供应商中立的存根,而在X11/GLX上则是
libGL。因此
您的程序动态加载就是实现。另外,
libGL.so
可能会导出更多的符号,可能涵盖所有受支持的OpenGL功能。作为一个程序员,你不应该依赖这个。同样在GLX中,所有入口点都是上下文不变的,也就是说,您可以一次加载它们并对所有上下文重用


在MacOS-X上,您可以通过一个框架获得OpenGL。ABI契约是每个操作系统版本的,因此程序可用的OpenGL函数完全由特定的操作系统版本决定。有一个推广机制,但几乎没有任何作用;只导出了几个特定于苹果的扩展,所以在苹果的操作系统上都不用担心它。

OpenGL wiki中的措辞有点不吉利。细节有点复杂。OpenGL环境有三个方面:

  • 操作系统ABI(应用程序二进制接口)合同
  • OpenGL上下文
  • 窗口系统集成
从历史上看,OpenGL与操作系统集成的方式是一种粗糙的黑客行为,只有一个设计拙劣的界面:因为OpenGL是一个设计用于与图形驱动程序对话的API,所以您不能安装第三方库的kine。操作系统必须提供一组特定的接口。ABI合同中明确规定了这些接口的具体内容。当然,每个操作系统都有自己的契约,甚至可能在不同版本之间发生变化

为了支持OpenGL的更新版本,定义了所谓的“扩展机制”,通过它可以加载ABI契约之外的函数。作为ABI合同一部分的功能也可能通过该机制提供,也可能不通过**提供,因此不要依赖于该假设

在Windows(从Win-NT-4和Win-95B起)中,ABI合同保证,程序将始终找到符合标准的OpenGL-1.1实现。为了简单起见,OpenGL-1.1入口点直接由接口存根库(opengl32.dll,带有symbo)公开