2008-11-11 87 views
24

我希望做一些修修補補OpenGL和Python和一直無法找到使用PyOpenGl與pygletPyOpenGl或pyglet?

你會推薦哪一個,爲什麼好的原因是什麼?

回答

28

正如託尼說,這真的要取決於你的目標。如果你在嘗試通過學習OpenGL或3D渲染的方式來進行學習,那麼我會放棄所有的愉悅,並且開始使用PyOpenGL,這與使用Python進行「原始」3D編程一樣接近。另一方面,如果您通過模擬遊戲或多媒體應用程序或嘗試瞭解一般編程實踐的方式來「修補」,Pyglet將爲您節省大量預先開發時間,方法是提供投入事件,聲音,文字/廣告牌等。通常,這種前期投資是阻止人們完成他們的項目的因素,所以爲你做的事情不會被忽視。 (這也是非常pythonic,以避免重新發明車輪。)

如果你正在尋找做任何重型起重機(這通常不屬於我的「修補」定義,但也許不是如果你是修補程序與3D引擎設計),那麼你可能想看看Python-Ogre,其中包括全功能和強大的OGRE 3D圖形引擎。

+8

有沒有人知道這是否2013年2月仍然如此? – abelito 2013-02-19 00:18:49

3

pyglet有很多不錯的演員中包含的它(如圖片加載和聲音)。如果你剛開始,我會先嚐試pyglet,然後如果你覺得你想要更接近金屬,就切換到PyOpenGL。

真正重要的問題,雖然是:什麼是你想實現什麼?

+1

嘿。小調整:我認爲將PyOpenGL描述爲「更接近金屬」是潛在的誤導。 PyOpenGL確實不提供與Pyglet相同的高級內容,但另一方面,PyOpenGL提供的OpenGL綁定比Pyglet中的OpenGL綁定更友好,pythonic,更慢。 – 2010-11-24 17:54:37

3

我推動pyglet,因爲它有我所見過的這樣的東西最好的API。

Pyglet有OpenGL API以及。但是使用最近添加的頂點列表支持通常更好。

pyglet.gl

2

我會建議Pyglet因爲它很容易上手,並有一些基本的東西跑,然後你就可以按照自己的節奏加上更先進的技術。

5

我要說,Pyglet實際上超過PyOpenGL演變。它有自己的一個很好的API,並且它有一個圍繞着通過pyglet.gl模塊訪問的OpenGL的完整包裝! PyOpenGL甚至不包裝OpenGL所具有的所有功能。 Pyglet還有一個很好的庫,用於通過OpenGL渲染具有硬件加速功能的2D,並且它的製作精良。

如果你想你已經得到了Ogre和這樣

2

pyglet的GL API的強大現成的3D引擎是隔靴搔癢一樣好PyOpenGL的 - pyglet的處於原始ctypes的層,這意味着你需要學習ctypes也是如此。如果你打算做一堆OpenGL編程,你會想使用PyOpenGL。

好的是你可以混合兩個就好。使用pyglet來提供GL上下文,聲音,事件,圖像加載和紋理管理,文本渲染等等。使用PyOpenGL來實現你需要的實際OpenGL編程。

27

從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%提供了方便。

+0

Pyglet的最新版本(1.3,目前處於測試階段)增加了對直接openGL調用和指定opengl頂點傳遞給Pyglet批處理的更多支持。 – 2018-01-03 16:33:45

3

嗯,我會建議pyglet,它真的提供了一個遊戲或應用程序所需的一切。

你要知道,你可以做很多事情pyglet與PyOpenGL做,例如創建一個窗口,所有你需要做的是:
glutInitWindow(標題)

雖然覺得glutInitDisplayMode國際上被稱爲在那之前。

簡單的總結:如果你不想代碼直到你哭,選擇pyglet,但如果你想成爲一個主人,選擇PyOpenGL。請轉至http://pyopengl.sourcefourge.net閱讀PyOpenGL上的文檔並致電http://pyglet.org閱讀pyglet上的文檔。希望這有幫助!

3

嘗試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您可以創建一個簡單的頂點着色器與一個單一的電話:

my_vertex_shader = ctx.vertex_shader(''' 
    #version 330 
    in vec2 vert; 
    void main() { 
     gl_Position = vec4(vert, 0.0, 1.0); 
    } 
''') 

隨着ModernGL你必須通過對OpenGL API的完全控制。