首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyOpenGl还是pyglet?

PyOpenGl还是pyglet?
EN

Stack Overflow用户
提问于 2008-11-11 03:17:03
回答 9查看 18.3K关注 0票数 25

我希望对openGL和Python做一些修补工作,但还没有找到使用PyOpenGl与pyglet的好理由

你会推荐哪一个?为什么?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-11-11 04:03:04

正如托尼所说,这真的要取决于你的目标。如果您正在“修修补补”,试图了解OpenGL或3D渲染的一般知识,那么我将省去所有的寒酸,开始使用PyOpenGL,这与使用Python进行“原始”3D编程是一样接近的。

另一方面,如果您正在通过模拟游戏或多媒体应用程序的方式“修修补补”,或者试图学习一般的编程实践,那么Pyglet将通过提供输入事件、声音、文本/广告牌等的挂钩,为您节省大量的前期开发时间。通常,这种前期投资会阻止人们完成他们的项目,因此为您完成它是不可忽视的事情。(为了避免重复发明轮子,这也是非常Pythonic式的。)

如果你想做一些繁重的工作(这通常不属于我对“修补”的定义,但如果你正在修补3D引擎的设计,可能就不会),那么你可能会想看看Python-Ogre,它包装了非常全功能和健壮的OGRE 3D图形引擎。

票数 32
EN

Stack Overflow用户

发布于 2010-11-22 22:21:04

从pyglet开始。它包含了最好的高级应用程序接口,其中包含了您需要的所有入门知识,从打开窗口到使用其友好而强大的Sprite和Batch类绘制精灵和OpenGL原语。

稍后,您可能还想编写自己的低级代码,直接调用glDrawArrays等OpenGL函数。您可以使用pyglet的OpenGL绑定或PyOpenGL来实现这一点。好消息是,无论您使用哪种方法,都可以将这样的调用插入到现有pyglet应用程序的中间,它们将“直接工作”。将你的代码从Pyglet转换到PyOpenGL是相当容易的,所以这不是一个你需要预先考虑的决定。两者之间的权衡是:

PyOpenGL的绑定使OpenGL界面更加友好和pythonic风格。例如,您可以传递许多不同形式的顶点数组,ctype数组、numpy数组、普通列表等,PyOpenGL会将它们转换为OpenGL可以使用的东西。这样的事情让PyOpenGL变得非常简单和方便。

pyglet的OpenGL绑定是自动生成的,并且不像PyOpenGL那样易于使用。例如,有时您必须手动创建ctypes对象,以便将“C指针”类型的参数传递给OpenGL。这可能很麻烦。不过,积极的一面是pyglet的绑定速度要快得多。

这意味着有一个最佳的中间地带:使用pyglet进行窗口、鼠标事件、声音等。然后,当您想要进行直接的OpenGL函数调用时,使用PyOpenGL的友好API。然后,在优化时,只需将内部呈现循环中的一小部分性能关键型PyOpenGL调用替换为pyglet等效项。对我来说,这让我的帧率提高了2到4倍,PyOpenGL对我90%的代码都很方便。

票数 32
EN

Stack Overflow用户

发布于 2016-07-07 02:31:06

试试ModernGL

代码语言:javascript
复制
pip install ModernGL

  • PyOpenGL是原始OpenGL接口的自动生成版本(使用SWIG生成)。原始的python应用程序接口对OpenGL不友好。生成的python绑定很难使用。

  • pyglet主要用于窗口创建和事件处理,但是您也可以使用类似PyOpenGL的应用程序接口(例如pyglet.gl.glClearColor)

  • pygame提供了一个窗口,您可以在其中使用PyOpenGL进行渲染。

  • ModernGL是PyOpenGL的一个很好的替代品,你可以用更少的代码来使用现代的OpenGL应用编程接口。ModernGL本身不会创建窗口,但您可以将其集成到pygletpygamePyQt5甚至GLUT中。编辑窗口你现在可以使用-独立创建窗口了。pip install moderngl-window

在ModernGL中,可以使用单个调用创建简单的着色器程序:

代码语言:javascript
复制
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应用编程接口。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/279912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档