PyOpenGL基礎 - MahalJsp

文章推薦指數: 80 %
投票人數:10人

本篇討論在Python中使用PyQt5 視窗環境,將OpenGL運算後的資料, ... gl.glViewport(0, 0, width, height) def processInput(window): if glfw. 簡介 OpenGL是一種高速演算3D立體圖形資料的函數庫,它可以啟動GPU硬体資源進行運算,效能驚奇。

GPU的圖形演算速度,比純CPU演算快上好幾倍,甚至上千倍。

OpenGL可適用於C++,Java,C#,Python.理論上,OpenGL本身並沒有視窗功能,只負責高速運算3D的圖形資料。

所以要把運算後的資料顯示出來,需靠各種程式語言的視窗套件來顯示圖形。

本篇討論在Python中使用PyQt5視窗環境,將OpenGL運算後的資料,經由OpenGLWidget元件顯示出來。

準備顯示的視窗 即然OpenGL並沒有顯示圖形的視窗,所以需先啟動PyQt5的視窗功能。

請在qtdesigner設計一個MainWindow主視窗,然後於其中加入QFrame元件。

請注意,QFrame裏面不用加入任何元件,連QOpenGLWidget元件都不用加入。

因為我們必需複寫QOpenGLWieget裏的paintGL()方法。

所以我們必需自創一個自已的QOpenGLWidget子類別.  下面的代碼,執行結果只會有一個黑色的視窗 importsysfromPyQt5.QtWidgetsimportQMainWindow,QApplication,QBoxLayout,QVBoxLayoutfromui.ui_mainwindowimportUi_MainWindowfromPyQt5.QtWidgetsimportQOpenGLWidgetclassMahalGl(QOpenGLWidget):def__init__(self,parent=None):super().__init__(parent)defpaintGL(self):#當視窗Ready時、改變視窗大小、或是在外部程式執行update方法時,就會執行這裏的程式passclassMainWindow(QMainWindow,Ui_MainWindow):def__init__(self,parent=None):super().__init__(parent)self.setupUi(self)layout=QVBoxLayout(self.frame)self.gl=MahalGl()layout.addWidget(self.gl)if__name__=='__main__':app=QApplication(sys.argv)frame=MainWindow()frame.show()app.exec() 安裝套件 要控製QOpenGLWidget這個黑色的框框,需使用OpenGL繪製。

但OpenGL是用C語言寫成的。

所以在Python必需有一個介面來調用OpneGL。

此介面為PyOpenGL,所以需先安裝此套件,請使用如下指令安裝:pipinstallPyOpenGL。

paintGL QOpenGLWidget裏的paintGL方法,是繪製圖形的主程式。

當視窗Ready時、改變視窗大小、或是在外部執行update方法時,就會啟動paintGL。

因此,繪圖的工作,全寫在這方法裏面。

paintGL方法裏的第一行,一定要寫清除指令 glClear(GL_COLOR_BUFFER_BIT) 因為這個方法的目的,就是要重繪所有的圖形。

如果沒有執行glClear清除指令,就會留下先前繪製的殘影。

圖元標識 OpenGL最基礎的是畫點,線,三角形。

若要畫點,就需先寫如下指令 glBegin(GL_POINTS)glVertex3f(座標)#第一點座標glVertex3f(座標)#第二點座標glVertex3f(座標)#第三點座標glEnd() GL_POINT即為指定要畫點,稱為圖元標識,必需使用glBegin()及glEnd()包含起來。

常用的標識有如下 點:GL_POINTS線:GL_LINES連續線:GL_LINE_STRIP封閉線:GL_LINE_LOOP獨立三角形:GL_TRIANGLES連續三角形:GL_TRIANGLE_STRIP三角形扇面:GL_TRIANGLE_FAN aa     todo glutdlls.zip https://www.opengl.org/resources/libraries/glut/glut_downloads.php 自帶視窗 下載https://www.glfw.org/download.html 解開後,將lib-vc2019/glfw3.dllcopy到專案中 下載https://github.com/rougier/pyglfw解開後,將glfw.pycopy到專案中 importsys,osimportOpenGL.GLasglimportglfwWIN_WIDTH=800WIN_HEIGHT=600defframebuffer_size_callback(window,width,height):gl.glViewport(0,0,width,height)defprocessInput(window):ifglfw.glfwGetKey(window,glfw.GLFW_KEY_ESCAPE)==glfw.GLFW_PRESS:glfw.glfwSetWindowShouldClose()defmain():glfw.glfwInit()glfw.glfwWindowHint(glfw.GLFW_CONTEXT_VERSION_MAJOR,3)glfw.glfwWindowHint(glfw.GLFW_CONTEXT_VERSION_MINOR,3)glfw.glfwWindowHint(glfw.GLFW_OPENGL_PROFILE,glfw.GLFW_OPENGL_CORE_PROFILE)window=glfw.glfwCreateWindow(WIN_WIDTH,WIN_HEIGHT,"學習OpenGL".encode(),0,0)ifwindow==0:print("failedtocreatewindow")glfw.glfwTerminate()glfw.glfwMakeContextCurrent(window)glfw.glfwSetFramebufferSizeCallback(window,framebuffer_size_callback)whilenotglfw.glfwWindowShouldClose(window):processInput(window)gl.glClearColor(0.2,0.3,0.3,1.0)gl.glClear(gl.GL_COLOR_BUFFER_BIT)glfw.glfwSwapBuffers(window)glfw.glfwPollEvents()glfw.glfwTerminate()if__name__=="__main__":main() https://www.itread01.com/content/1546183820.htmlhttps://kknews.cc/zh-tw/code/nlvvp3q.html 文章導覽 直播系統Java繪圖 個人資訊 站長:ThomasWu 經歷: 中興大學講師 聯成電腦講師 立向營造資訊顧問 仁寶工業電腦副理 東元集團資深經理 英業達集團課長 巨匠電腦講師 eMail:[email protected] 本站搜尋 Searchfor: Search 分類分類 選取分類 Android  (101)    Java版  (68)       AdnroidApp高階  (8)       AndroidApp初階  (17)       AndroidApp進階  (10)       AndroidMSSQL  (3)       AndroidMySQL  (2)       AndroidOpenGLES  (7)       Android發怖  (4)       Android其他  (4)       Android圖表  (3)       Camera開發  (7)          CameraAPI1  (4)          CameraAPI2  (2)       CustomSDK  (3)    Kotlin版  (32)       JNI  (6)       初階  (8)          常用查詢  (3)       專案  (2)       進階  (16)          CameraX  (3)          Mapbox_kotlin  (9) ASP.NET  (3) C/C++  (23)    APCS  (7)       105_10  (2)       106_03  (3)       106_10  (2)    C++初階  (6)    C++進階  (4)    C++物件導向  (4) ffmpeg  (4) GPIO控制  (12) Java  (71)    JavaAPI  (7)    JAVAMISC  (3)    JavaThread  (7)    Java基礎  (7)    Java物件導向  (11)    Java視窗設計  (3)    Java資料庫  (2)    Java進階  (5)    OCP國際認証  (20)       OCA803Exams  (4)       OCA808Exams  (4)       OCP804Exams  (10)    大型專案技巧  (4)    電算機概論  (2) Kotlin  (24)    Kotlin基楚  (6)    kotlin進階  (11)    視窗設計  (4) PHP  (8) Python  (194)    AI人工智慧  (16)       scikitlearn  (1)       物件偵測  (15)    AI基礎  (24)       ImageMagick  (1)       OpneCV  (8)       YOLO  (6)       人臉辨識  (1)    Django  (7)    MTA  (7)    PyQt5視窗設計  (15)    PythonIO  (4)    Python函數  (6)    Python基礎  (26)       Python基礎程式  (12)       Python進階程式  (14)          Python物件導向  (14)    python專案  (4)    WebCam  (4)    wxPython視窗設計  (14)    例外處理  (2)    其他  (3)    多工  (5)    常用內建模組  (3)    爬蟲程式  (22)    資料分析  (12)    資料視覺化  (15) VisualC#  (75)    C#MSSQL  (3)    C#MySQL  (1)    C#OpenGL  (2)    C#列印  (4)    C#初階  (17)    C#物件導向  (6)    C#進階  (8)    C#高階  (5)    OpenCV  (3)    SerialPort  (1)    WPF  (20)       WPFChart  (1)       WPFResource  (2)       WPFUI  (3) 數學  (7) 未分類  (14) 樹莓派  (14) 雜記  (15)    NikonP1000  (4)    中藥  (3)    八字  (3) 雲端架設  (69)    Git  (6)       AndroidGIT  (1)       GitTutorial  (4)       VSGit  (1)    JSP  (3)    Ubuntu  (22)    VMWare  (3)    WAMP  (4)    網路概論  (6)    資料庫  (18)       MSSQL  (4)       MySQL  (13) 站務管理 登入 訂閱網站內容的資訊提供 訂閱留言的資訊提供 WordPress.org台灣繁體中文



請為這篇文章評分?