Python PyOpenGl还是pyglet?

Python PyOpenGl还是pyglet?,python,pyglet,pyopengl,Python,Pyglet,Pyopengl,我想对openGL和Python进行一些修补,但还没有找到使用PyOpenGl和pyglet的好理由 你会推荐哪一种?为什么?pyglet附带了很多不错的附加功能(比如图像加载和声音)。如果你刚开始的话,我会先试试pyglet,如果你想更接近金属的话,再切换到PyOpenGL 但真正重要的问题是:你想完成什么 正如托尼所说,这实际上取决于你的目标。如果您正在“修补”尝试学习OpenGL或3D渲染,那么我将省去所有的寒暄,开始使用PyOpenGL,您将使用Python进行“原始”3D编程 另一方面

我想对openGL和Python进行一些修补,但还没有找到使用PyOpenGl和pyglet的好理由


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

pyglet附带了很多不错的附加功能(比如图像加载和声音)。如果你刚开始的话,我会先试试pyglet,如果你想更接近金属的话,再切换到PyOpenGL


但真正重要的问题是:你想完成什么

正如托尼所说,这实际上取决于你的目标。如果您正在“修补”尝试学习OpenGL或3D渲染,那么我将省去所有的寒暄,开始使用PyOpenGL,您将使用Python进行“原始”3D编程

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


如果你想做任何类型的重型提升(这通常不属于我对“修补”的定义范围,但如果你在修补3D引擎设计,可能不会),那么你可能想看看Python Ogre,它包装了功能齐全、功能强大的图形引擎。

我之所以推广pyglet,是因为它有我见过的最好的API

Pyglet也有opengl API。但使用最近添加的顶点列表支持通常更好


gl

我推荐pyglet,因为它很容易入门并运行一些基本功能,然后您可以按照自己的速度添加更先进的技术。

我想说pyglet实际上比PyOpenGL更先进。它自己有一个很好的API,并且它有一个通过pyglet.gl模块访问的OpenGL的完整包装器!PyOpenGL甚至没有包装OpenGL的所有功能。 Pyglet还有一个很棒的库,可以通过OpenGL通过硬件加速渲染2D,而且它做得非常好


如果你想要一个强大的现成的3D引擎,那么pyglet的GL API远没有PyOpenGL的好——pyglet在原始ctypes层,这意味着你还需要学习ctypes。如果你打算做一大堆OpenGL编程,你会想使用PyOpenGL


好的是你可以把这两种混合得很好。使用pyglet提供GL上下文、声音、事件、图像加载和纹理管理、文本渲染等。使用PyOpenGL进行实际的OpenGL编程。

从pyglet开始。它包含了最好的高级API,其中包含了入门所需的一切,从打开窗口到使用友好且功能强大的Sprite和Batch类绘制Sprite和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。然后,在进行优化时,将内部渲染循环中的性能关键型PyOpenGL调用中的一小部分替换为pyglet等价物。对我来说,这使我的帧速率提高了2到4倍,PyOpenGL为我90%的代码提供了便利。

嗯,我建议使用pyglet,它确实提供了游戏或应用程序所需的一切

请注意,pyglet可以用PyOpenGL做很多事情,例如创建一个窗口,您需要做的就是:
glutInitWindow(标题)

尽管我认为在那之前必须调用glutInitDisplayMode

简单总结:如果你不想哭就开始编码,选择pyglet,但如果你想成为大师,选择PyOpenGL。转到PyOpenGL上读取文档,转到pyglet上读取文档。希望这是有帮助的

试试看

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

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

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

  • ModernGL是PyOpenGL的一个很好的替代品,您可以用更少的代码来使用现代openglapi。ModernGL不会自行创建窗口,但您可以
    pip install 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);
            }
        ''',
    )