我希望对openGL和Python做一些修改,并且无法找到使用PyOpenGl和pyglet的充分理由
你会推荐哪个?为什么?
从pyglet开始.它包含最好的高级API,其中包含您开始使用所需的一切,从打开窗口到使用友好而强大的Sprite和Batch类绘制精灵和OpenGL基元.
稍后,您可能还想编写自己的低级代码,直接调用OpenGL函数,如glDrawArrays等.您可以使用pyglet的OpenGL绑定或使用PyOpenGL来执行此操作.好消息是,无论您使用哪种方式,都可以将这些调用直接插入到现有pyglet应用程序的中间,并且它们将"正常工作".将代码从Pyglet转换为PyOpenGL非常简单,因此这不是您需要过早担心的决定.两者之间的交易是:
PyOpenGL的绑定使OpenGL界面更加友好和pythonic.例如,您可以传递许多不同形式的顶点数组,ctypes数组,numpy数组,普通列表等,PyOpenGL会将它们转换为OpenGL可以使用的东西.这样的事情使得PyOpenGL非常简单方便.
pyglet的OpenGL绑定是自动生成的,并且不像PyOpenGL那样友好.例如,有时您必须手动创建ctypes对象,以便将"C指针"类型的args传递给OpenGL.这可能是繁琐的.尽管如此,pyglet的绑定往往会明显加快.
这意味着存在一个最佳的中间立场:使用pyglet进行窗口化,鼠标事件,声音等.当您想要进行直接的OpenGL函数调用时,请使用PyOpenGL友好的API.然后在优化时,使用pyglet等效项替换内部渲染循环中的一小部分性能关键PyOpenGL调用.对我来说,这给我的帧速率提高了2到4倍,PyOpenGL方便了90%的代码.
正如托尼所说,这实际上取决于你的目标.如果你正在"修补"试图了解一般的OpenGL或3D渲染,我会免除所有的欢乐并开始使用PyOpenGL,这就是你要接近使用Python的"原始"3D编程.
另一方面,如果你通过模拟游戏或多媒体应用程序来"修补",或者试图了解一般的编程实践,那么Pyglet将通过为输入事件提供钩子来节省大量的前期开发时间这些前期投资通常会阻止人们完成他们的项目,因此为您完成这项工作并不是一件值得忽视的事情.(它也是非常Pythonic,以避免重新发明轮子.)
如果您正在寻求进行任何类型的重型提升(通常不属于我的"修补"定义,但如果您正在修改3D引擎设计,则可能没有),那么您可能需要查看Python-Ogre ,它包装的很全功能和强大的OGRE 3D图形引擎.
试试ModernGL.
pip install ModernGL
PyOpenGL是原始OpenGL API的自动生成版本(使用SWIG生成).最初的OpenGL API不是python友好的.生成的python绑定很难使用.
pyglet主要用于窗口创建和事件处理,但是你可以使用PyOpenGL之类的API(例如pyglet.gl.glClearColor
)
pygame提供了一个窗口,您可以使用PyOpenGL进行渲染.
ModernGL是PyOpenGL的绝佳替代品,您可以使用现代OpenGL API编写更少的代码.ModernGL不会自己创建一个窗口,但你可以将它集成到pyglet,pygame,PyQt5甚至GLUT中.
在ModernGL中,您可以使用单个调用创建一个简单的着色器程序:
prog = ctx.program( vertex_shader=''' #version 330 in vec2 in_vert; void main() { gl_Position = vec4(in_vert, 0.0, 1.0); } ''', fragment_shader=''' #version 330 out vec4 f_color; void main() { f_color = vec4(0.3, 0.5, 1.0, 1.0); } ''', )
使用ModernGL,您可以完全控制OpenGL API.
我会说Pyglet实际上比PyOpenGL更进化.它有一个很好的API,它有一个完整的包装,通过pyglet.gl模块访问OpenGL!PyOpenGL甚至没有包装OpenGL的所有功能.Pyglet还有一个很棒的库,可以通过OpenGL通过硬件加速渲染2D,而且它的制作非常好.
如果你想要一个功能强大的现成3D引擎,你就有了Ogre等