如何创建自己的opengl绑定或库

如何创建自己的opengl绑定或库,opengl,Opengl,我对图形编程比较陌生,所以我想从最基本的开始。我看到有像PyOpenGl这样的库,它提供了与openglapi本身的绑定。现在,我真的很想自己创建类似于PyOpenGl的东西,这样我就可以了解过程中的一切工作方式 我可以创建像PyOpenGl或GLFW这样的库吗?如果是的话,请给我一些我应该做什么的一般提示 如果没有,请向我解释为什么我不能创建自己的绑定,如果我上面的问题听起来很荒谬,我表示歉意 PyOpenGL是一个相当薄的包装器,在大多数情况下,它只是将Python函数调用转换为相同名称的本

我对图形编程比较陌生,所以我想从最基本的开始。我看到有像PyOpenGl这样的库,它提供了与openglapi本身的绑定。现在,我真的很想自己创建类似于PyOpenGl的东西,这样我就可以了解过程中的一切工作方式

我可以创建像PyOpenGl或GLFW这样的库吗?如果是的话,请给我一些我应该做什么的一般提示


如果没有,请向我解释为什么我不能创建自己的绑定,如果我上面的问题听起来很荒谬,我表示歉意

PyOpenGL
是一个相当薄的包装器,在大多数情况下,它只是将Python函数调用转换为相同名称的本机代码函数调用。有一些小细节,比如在组合中调用约定,但实际上这些都是无聊的东西。事实是(就OpenGL而言),您使用PyOpenGL在Python中编写的源代码看起来与您使用C编写的源代码几乎相同。PyOpenGL做了一些“聪明”的事情,比如提供方法将NumPy数组接口到接受数据指针参数的OpenGL调用,但这只是内部管理

当你用C或者更极端的汇编语言(完全可能)调用OpenGL时,这是你能达到的最低水平(使用OpenGL),除了编写自己的GPU设备驱动程序。编写GPU设备驱动程序是一项非常艰巨的工作;它实际上需要数百万行C代码(据说NVidia的OpenGL实现包含约4000万LoC,AMD和Intel GPU都有开源驱动程序,而且每个驱动程序都有MLoC)


如果您对中间立场感兴趣,可以看看Vulkan API。如果为图形编写更高级别的包装器是您的事情,我建议您为Vulkan实现一些更高级别的API/渲染器,并将其与Python接口。作为一种学习体验(IMHO),这可能更有价值。

OpenGL API存在于图形卡的驱动程序中。所有OpenGL函数都在那里。你只需要知道如何得到它们。正如Spektre所说,过程是:

  • 创建OpenGL上下文。这是操作系统的工作。每个操作系统都有自己的功能 方法及其问题。阅读
  • 将函数指针定义为
    glext.h
    does,然后从 司机。除了标准的OpenGL函数外,供应商还添加了自己的函数 这些被称为“扩展”。你可以看到GLEW是如何完成这项工作的。如果您想设置所有函数和扩展,那么就制作一个使用
    glext.h
    的脚本,因为它们大约有一千个
  • 您可以从下载
    glext.h

    做类似GLFW的事情需要知道如何创建窗口以及如何处理键盘和鼠标的消息。同样,这取决于操作系统。在窗户上有一条路。在Linux上,这取决于使用的窗口管理器,例如GTK+。或者直接使用X11。或者


    无论如何,我最好的建议是,你可以阅读GLEW和GLFW是如何做的,看看他们的代码。但是不要浪费太多时间。更喜欢在OpenGL上获得经验,以后再使用这些“diggins”。

    如果你是图形编程新手,那么尝试编写自己的绑定可能不是一个好主意。是的,我想是这样,但我真的很想这么做。如果你知道怎么做,你能给我一些建议吗?我相信我会学到必要的技能,因为我将继续我没有一个链接给你,对不起,但我必须补充。。。底层的东西是以一种非常具体的方式编写的,以支持一种定义非常严格的高层用法。如果你不了解OpenGL是如何运行的,你会发现以一种有用的方式与硬件交互非常困难。我实际上是加州大学的学生,我有一年的机器代码。所以我真的很想深入到最基本的东西。即使它涉及机器代码,我也不知道这在python中是如何工作的(如果您希望在该语言中使用该标记,您可能需要添加该标记)。在windows上,您将使用
    LoadLibraryA
    GetProcAddress
    wglGetProcAddress
    的组合,如前所述