我希望对openGL和Python做一些修补,但是找不到使用PyOpenGl和pyglet的合理理由
你会推荐哪一个?为什么?
答案 0 :(得分:32)
从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%的代码。
答案 1 :(得分:29)
正如托尼所说,这实际上取决于你的目标。如果你正在“修补”试图了解一般的OpenGL或3D渲染,我会免除所有的烦恼并开始使用PyOpenGL,这就是你要接近使用Python的“原始”3D编程
另一方面,如果你通过模拟游戏或多媒体应用程序来“修补”,或者试图了解一般的编程实践,那么Pyglet将通过提供钩子来节省大量的前期开发时间对于输入事件,声音,文本/广告牌等等。通常,这种前期投资会阻止人们完成他们的项目,因此为您完成这项工作并不是一件值得忽视的事情。 (避免重新发明轮子也是非常Pythonic。)
如果您正在寻求进行任何类型的重型提升(通常不属于“修修补补”的定义,但如果您正在修改3D引擎设计,则可能没有),那么您可能需要查看一下Python-Ogre,它包含非常功能齐全且功能强大的OGRE 3D图形引擎。
答案 2 :(得分:7)
尝试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。
答案 3 :(得分:6)
我会说Pyglet实际上比PyOpenGL更进化。它有一个很好的API,它有一个完整的包装,通过pyglet.gl模块访问OpenGL! PyOpenGL甚至没有包装OpenGL的所有功能。 Pyglet还有一个很棒的库,可以通过OpenGL使用硬件加速来渲染2D,而且它的制作非常好。
如果您想要一个功能强大的现成3D引擎,那么您需要Ogre等
答案 4 :(得分:4)
pyglet包含很多很好的附加功能(如图像加载和声音)。如果你刚开始,我首先尝试pyglet,然后切换到PyOpenGL,如果你想要更接近金属。
但真正重要的问题是:你想要完成什么?
答案 5 :(得分:4)
我推广pyglet,因为它拥有我在这样的东西上看到的最好的API。
Pyglet也有opengl API。但是使用最近添加的顶点列表支持通常更好。
pyglet.gl
答案 6 :(得分:4)
嗯,我建议使用pyglet,它确实提供了游戏或应用程序所需的一切。
请注意,你可以做pyglet对PyOpenGL做的很多事情,例如创建一个窗口你需要做的就是:
glutInitWindow(标题)
虽然我认为必须在此之前调用glutInitDisplayMode。
简单总结:如果你不想编码直到你哭,请选择pyglet,但如果你想成为一个主人,请选择PyOpenGL。转到http://pyopengl.sourcefourge.net阅读PyOpenGL上的文档和http://pyglet.org阅读pyglet上的文档。希望这有用!
答案 7 :(得分:3)
我会推荐Pyglet因为它很容易上手并且有一些基本的运行,然后你可以按照自己的节奏添加更多高级技术。
答案 8 :(得分:3)
pyglet的GL API远没有PyOpenGL那么好 - pyglet位于原始ctypes层,这意味着你也需要学习ctypes。如果你打算做一堆OpenGL编程,你会想要使用PyOpenGL。
好处是你可以将两者混合得很好。使用pyglet提供GL上下文,声音,事件,图像加载和纹理管理,文本渲染等。使用PyOpenGL进行实际的OpenGL编程。