来自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工作流程。
更新
找到那些gl函数调用被链接到opengl32.lib。这是什么意思?我是否使用了windows10默认的1.1gl实现?所以,实际上我不需要从实际驱动程序导出这些函数,比如nvoglv32.dll,而是在opengl32.lib中使用静态链接函数
发布于 2016-04-16 11:48:55
OpenGL wiki中的这种措辞有点不吉利。细节要复杂一点。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的操作系统上甚至不用去理会它。
https://stackoverflow.com/questions/36661449
复制相似问题