【发布时间】:2010-09-21 17:59:19
【问题描述】:
我希望对 openGL 和 Python 进行一些修改,但找不到使用 PyOpenGl 与 pyglet 的充分理由
您会推荐哪个以及为什么?
【问题讨论】:
我希望对 openGL 和 Python 进行一些修改,但找不到使用 PyOpenGl 与 pyglet 的充分理由
您会推荐哪个以及为什么?
【问题讨论】:
正如托尼所说,这真的取决于你的目标。如果您正在“修补”以尝试学习 OpenGL 或一般的 3D 渲染,那么我将免除所有的寒暄并开始使用 PyOpenGL,这与您将使用 Python 进行“原始”3D 编程一样接近.
另一方面,如果您通过模拟游戏或多媒体应用程序来“修补”,或者尝试学习一般的编程实践,那么 Pyglet 将通过提供挂钩为您节省大量前期开发时间用于输入事件、声音、文本/广告牌等。通常,这种前期投资会阻止人们完成他们的项目,因此为您完成它是不容忽视的事情。 (避免重新发明轮子也是非常 Pythonic 的。)
如果您想要进行任何类型的重型起重(这通常不属于我对“修补”的定义,但如果您正在修补 3D 引擎设计,则可能不会)那么您可能想看看Python-Ogre,它封装了 very 功能齐全且功能强大的OGRE 3D 图形引擎。
【讨论】:
从 pyglet 开始。它包含最好的高级 API,包含您开始使用所需的一切,从打开窗口到使用友好且强大的 Sprite 和 Batch 类绘制精灵和 OpenGL 基元。
稍后,您可能还想编写自己的低级代码,直接调用诸如 glDrawArrays 等 OpenGL 函数。您可以使用 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,它确实提供了游戏或应用程序所需的一切。
请注意,pyglet 可以用 PyOpenGL 做很多事情,例如创建一个窗口,您只需:
glutInitWindow(标题)
虽然我认为 glutInitDisplayMode 必须在此之前调用。
简单总结:如果你哭到不想写代码,选择pyglet,但如果你想成为高手,选择PyOpenGL。转到 http://pyopengl.sourceforge.net 阅读 PyOpenGL 上的文档,转到 http://pyglet.org 阅读 pyglet 上的文档。希望这对您有所帮助!
【讨论】:
我会推荐 Pyglet,因为它很容易上手并运行一些基本的东西,然后您可以按照自己的节奏添加更高级的技术。
【讨论】: