PyOpenGL基礎

      在〈PyOpenGL基礎〉中尚無留言

簡介

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子類別. 

下面的代碼,執行結果只會有一個黑色的視窗

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QBoxLayout, QVBoxLayout
from ui.ui_mainwindow import Ui_MainWindow
from PyQt5.QtWidgets import QOpenGLWidget

class MahalGl(QOpenGLWidget):
def __init__(self, parent=None):
super().__init__(parent)
def paintGL(self):
#當視窗Ready時、改變視窗大小、或是在外部程式執行update方法時,就會執行這裏的程式

pass
class MainWindow(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,所以需先安裝此套件,請使用如下指令安裝 :
pip install PyOpenGL

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.dll copy 到專案中

下載 https://github.com/rougier/pyglfw
解開後,將glfw.py copy 到專案中

import sys, os
import OpenGL.GL as gl
import glfw

WIN_WIDTH = 800
WIN_HEIGHT = 600

def framebuffer_size_callback(window, width, height):
gl.glViewport(0, 0, width, height)

def processInput(window):
if glfw.glfwGetKey(window, glfw.GLFW_KEY_ESCAPE) == glfw.GLFW_PRESS:
glfw.glfwSetWindowShouldClose()

def main():
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)
if window == 0:
print("failed to create window")
glfw.glfwTerminate()

glfw.glfwMakeContextCurrent(window)
glfw.glfwSetFramebufferSizeCallback(window, framebuffer_size_callback)

while not glfw.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.html
https://kknews.cc/zh-tw/code/nlvvp3q.html

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *