首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLFW负荷函数

GLFW负荷函数
EN

Stack Overflow用户
提问于 2016-04-16 07:32:38
回答 1查看 1.2K关注 0票数 0

来自Opengl wiki:

OpenGL初始化分为两个阶段。第一个阶段是创建一个OpenGL上下文;第二个阶段是加载使用OpenGL所需的所有函数。 这个样板工作是用各种OpenGL加载库完成的;

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

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

代码语言:javascript
复制
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加载的所有函数如下

代码语言:javascript
复制
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工作流程。

更新

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-16 11:48:55

OpenGL wiki中的这种措辞有点不吉利。细节要复杂一点。OpenGL环境有三样东西:

  • 操作系统ABI (应用程序二进制接口)合同
  • OpenGL上下文
  • 窗口系统集成

从历史上看,OpenGL与操作系统集成的方式是一种粗制滥造,界面设计得很糟糕:因为OpenGL是一个设计用来与图形驱动程序对话的API,所以它不是你可以安装的第三方库中的一些元素。它的某些接口必须由操作系统提供。这些接口确切地写在ABI合同中。当然,每个操作系统都有自己的契约,甚至可能在不同版本之间发生变化。

为了支持较新版本的OpenGL,定义了所谓的“扩展机制”,通过该机制可以加载ABI合同以外的函数。作为ABI合同一部分的函数也可能(或者**)也不能通过这种机制使用,所以不要依赖于这个假设。

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

在X11/GLX环境(例如Linux、*BSDs、Solaris)中,情况如下: ABI契约指定,如果OpenGL可用,那么OpenGL实现共享对象至少必须导出Openg-1.2的函数。这是特别值得注意的!在Windows上有一些与供应商无关的存根,而在X11/GLX上,您的程序动态加载的libGL.so是实现。此外,libGL.so可能会导出更多的符号,可能涵盖所有受支持的OpenGL特性。作为一名程序员,您不应该依赖这一点。在GLX中,还断言所有入口点都是上下文不变的,即您可以加载它们一次并在所有上下文中重用它们。

在MacOS上,您可以通过一个框架获得OpenGL。ABI合同是按操作系统版本计算的,因此程序可用的OpenGL函数完全由特定的OS版本决定。有一个扩展机制,但几乎没有任何用途;只有少数几个特定于苹果的扩展被导出,所以在Apple的操作系统上甚至不用去理会它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36661449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档