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