2008-11-11 88 views
24

我希望做一些修修补补OpenGL和Python和一直无法找到使用PyOpenGl与pygletPyOpenGl或pyglet?

你会推荐哪一个,为什么好的原因是什么?

回答

28

正如托尼说,这真的要取决于你的目标。如果你在尝试通过学习OpenGL或3D渲染的方式来进行学习,那么我会放弃所有的愉悦,并且开始使用PyOpenGL,这与使用Python进行“原始”3D编程一样接近。另一方面,如果您通过模拟游戏或多媒体应用程序或尝试了解一般编程实践的方式来“修补”,Pyglet将为您节省大量预先开发时间,方法是提供投入事件,声音,文字/广告牌等。通常,这种前期投资是阻止人们完成他们的项目的因素,所以为你做的事情不会被忽视。 (这也是非常pythonic,以避免重新发明车轮。)

如果你正在寻找做任何重型起重机(这通常不属于我的“修补”定义,但也许不是如果你是修补程序与3D引擎设计),那么你可能想看看Python-Ogre,其中包括全功能和强大的OGRE 3D图形引擎。

+8

有没有人知道这是否2013年2月仍然如此? – abelito 2013-02-19 00:18:49

3

pyglet有很多不错的演员中包含的它(如图片加载和声音)。如果你刚开始,我会先尝试pyglet,然后如果你觉得你想要更接近金属,就切换到PyOpenGL。

真正重要的问题,虽然是:什么是你想实现什么?

+1

嘿。小调整:我认为将PyOpenGL描述为“更接近金属”是潜在的误导。 PyOpenGL确实不提供与Pyglet相同的高级内容,但另一方面,PyOpenGL提供的OpenGL绑定比Pyglet中的OpenGL绑定更友好,pythonic,更慢。 – 2010-11-24 17:54:37

3

我推动pyglet,因为它有我所见过的这样的东西最好的API。

Pyglet有OpenGL API以及。但是使用最近添加的顶点列表支持通常更好。

pyglet.gl

2

我会建议Pyglet因为它很容易上手,并有一些基本的东西跑,然后你就可以按照自己的节奏加上更先进的技术。

5

我要说,Pyglet实际上超过PyOpenGL演变。它有自己的一个很好的API,并且它有一个围绕着通过pyglet.gl模块访问的OpenGL的完整包装! PyOpenGL甚至不包装OpenGL所具有的所有功能。 Pyglet还有一个很好的库,用于通过OpenGL渲染具有硬件加速功能的2D,并且它的制作精良。

如果你想你已经得到了Ogre和这样

2

pyglet的GL API的强大现成的3D引擎是隔靴搔痒一样好PyOpenGL的 - pyglet的处于原始ctypes的层,这意味着你需要学习ctypes也是如此。如果你打算做一堆OpenGL编程,你会想使用PyOpenGL。

好的是你可以混合两个就好。使用pyglet来提供GL上下文,声音,事件,图像加载和纹理管理,文本渲染等等。使用PyOpenGL来实现你需要的实际OpenGL编程。

27

从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指针”类型的参数传递给OpenGL。这可能很麻烦。尽管如此,pyglet的绑定往往要快得多。

这意味着有一个最佳的中间立场:使用pyglet进行窗口化,鼠标事件,声音等等。然后在想要直接进行OpenGL函数调用时使用PyOpenGL友好的API。然后在进行优化时,用pyglet等价物替换位于内部渲染循环内的性能至关重要的PyOpenGL调用的一小部分。对我而言,这使我的帧率更快了2到4倍,PyOpenGL为我的代码的90%提供了方便。

+0

Pyglet的最新版本(1.3,目前处于测试阶段)增加了对直接openGL调用和指定opengl顶点传递给Pyglet批处理的更多支持。 – 2018-01-03 16:33:45

3

嗯,我会建议pyglet,它真的提供了一个游戏或应用程序所需的一切。

你要知道,你可以做很多事情pyglet与PyOpenGL做,例如创建一个窗口,所有你需要做的是:
glutInitWindow(标题)

虽然觉得glutInitDisplayMode国际上被称为在那之前。

简单的总结:如果你不想代码直到你哭,选择pyglet,但如果你想成为一个主人,选择PyOpenGL。请转至http://pyopengl.sourcefourge.net阅读PyOpenGL上的文档并致电http://pyglet.org阅读pyglet上的文档。希望这有帮助!

3

尝试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您可以创建一个简单的顶点着色器与一个单一的电话:

my_vertex_shader = ctx.vertex_shader(''' 
    #version 330 
    in vec2 vert; 
    void main() { 
     gl_Position = vec4(vert, 0.0, 1.0); 
    } 
''') 

随着ModernGL你必须通过对OpenGL API的完全控制。