来自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
中的静态链接函数?
答案 0 :(得分:3)
OpenGL维基中的措辞有点不走运。细节有点复杂。 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的操作系统上甚至不用担心它。