GLFW加载功能

时间:2016-04-16 07:32:38

标签: opengl glfw

来自Opengl wiki:

  

OpenGL初始化有两个阶段。第一阶段是   创建OpenGL上下文;第二阶段是加载所有的   使用OpenGL的必要功能。

     

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

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

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

initWGLExtensions

所以渲染命令功能都在飞行中吗?它实际上是在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

这是否意味着我不需要加载任何其他GL功能?[[问题]] 只是对GL工作流程感到困惑。

更新

找出那些与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函数调用。这是什么意思?我使用windows10的默认1.1 gl实现?所以,我真的不需要从实际的驱动程序opengl32.lib中导出这些函数,而是使用nvoglv32.dll​中的静态链接函数?

1 个答案:

答案 0 :(得分:3)

OpenGL维基中的措辞有点不走运。细节有点复杂。 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上下文,OpenGL-1.1存根是不变的,即它们对于所有上下文都是相同的。扩展功能OTOH特定于每个上下文。因此,对于创建的每个OpenGL上下文,扩展函数指针必须单独加载,并在调用时与活动上下文正确匹配。这也意味着,您首先必须创建一个上下文(并使其处于活动状态),然后才能尝试加载其扩展函数。

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

在MacOS-X上,您可以通过框架获得OpenGL。 ABI合约是每个操作系统版本,因此程序可用的OpenGL功能完全由特定的操作系统版本决定。有一种延伸机制,但几乎没有任何用途;只有少数Apple特定的扩展名被导出,因此在Apple的操作系统上甚至不用担心它。