PyOpenGL Programming

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

OpenGL (ย่อมาจาก Open Graphics Library) เป็น Application Programming Interface (API) สำหรับควบคุม Graphics Processing Unit (GPU) ที่ใช้กันอย่างแพร่หลายในปัจจุบัน (เนื่องจากมี API แบบนี้ในโลกอยู่แค่สองตัว คือ OpenGL และ DirectX) จริงๆ แล้ว OpenGL เขียนขึ้นมาครั้งแรกเพื่อใช้กับภาษา C แต่หลังจากนั้นก็มีคนเขียนซอฟต์แวร์เพิ่มเติมให้ใ้ช้ OpenGL กับภาษาอื่นๆ เช่น Java, Pascal, Ruby, ฯลฯ ได้ PyOpenGL เป็นไลบรารีที่ทำให้ภาษาไพทอนใช้ OpenGL ได้ เอกสารนี้จะสอนวิธีการใช้ OpenGL ผ่านทาง PyOpenGL สร้างโปรแกรมเพื่อแสดงภาพสองมิติและสามมิติอย่างง่ายๆ

หากท่านต้องการอ่านเอกสารนี้ให้ได้อรรถรสมากที่สุด กรุณาใช้ Crunchy คุณสามารถดูวิดิทัศน์แสดงการติดตั้งและใช้ Crunchy ได้ที่นี่: วิธีการติดตั้งภาษา Python และ Crunchy

การติดตั้ง PyOpenGL

ก่อนติดตั้ง PyOpenGL คุณจะต้องติดตั้งภาษาไพทอนไว้ก่อนแล้ว เราแนะนำให้ติดตั้งภาษาไพทอนเวอร์ชัน 2.5.2 เนื่องจากมันเป็นเวอร์ชันที่ Crunchy สามารถทำงานร่วมด้วยอย่างราบรื่น

คุณสามารถดูวิดิทัศน์แสดงวิธีการติดตั้ง PyOpenGL ได้ที่นี่: http://access.cs.sci.ku.ac.th/~pramook/install-pyopengl/

ความรู้พื้นฐาน

OpenGL

ผู้ใช้ OpenGL สามารถใช้มันวาดรูปทรงสองมิติหรือสามมิติได้ โดยระุบุรูปทรงและรูปร่างพื้นฐาน เช่น จุด เส้น และรูปหลายเหลี่ยม เป็นต้น แล้ว OpenGL จะทำหน้าที่สร้างภาพสามมิตินั้นไว้บนหน่วยความจำที่่เรียกว่า framebuffer ซึ่งเก็บข้อมูลสีของแต่ละ pixel บนหน้าจอเอาไว้

OpenGL เป็นไลบรารีที่เหมาะสมต่อการสร้างโปรแกรมที่มีการตอบสนองต่อผู้ใช้แบบทันทีทันควัน (interactive) เนื่องจากการวาดรูปใช้ GPU จึงทำได้อย่างรวดเร็ว แต่ GPU เองไม่สามารถสร้างรูปที่มีรายละเอียดสูง หรือมีการกระจายตัวของแสงในฉากที่ซับซ้อนได้ จึงไม่เหมาะสำหรับใช้สร้างภาพนิ่งคุณภาพสูงหรือภาพยนตร์สามมิติต่างๆ

OpenGL ทำหน้าที่สั่ง GPU ให้วาดรูปเท่านั้น มันไม่ได้จัดการการติดต่อกับผู้ใช้ ไม่ได้จัดการวินโดว์ที่โปรแกรมใช้ และมันก็ไม่สามารถหา framebuffer มาใช้เองได้ ดังนั้นต้องมีโค้ดส่วนอื่นมาจัดการเรื่องพวกนี้ให้

GLUT

GLUT ย่อมาจาก OpenGL Utility Toolkit เป็นไลบรารีสำหรับจัดการส่วนติดต่อกับผู้ใช้และจัดการวินโดว์ให้ OpenGL กล่าวคือมันทำสิ่งที่ OpenGL ไม่ทำข้างบน GLUT เป็นไลบรารีที่เหมาะสมต่อการเรียน OpenGL เนื่องจากใช้งานง่ายและผู้ใช้ไม่ต้องเรียนรู้หรือจดจำอะไรมาก แต่ไม่เหมาะจะเอาไปใช้เขียนโปรแกรมประยุกต์จริงๆ เนื่องจากไม่มี GUI Widget ให้ใช้เลย นอกจากนี้โปรแกรมจะต้องรับข้อมูลเข้าจา่กผู้่ใช้ตามที่ GLUT กำหนดเท่านั้น ไม่สามารถจัดการการอ่านข้อมูลเข้าได้เอง

โปรแกรมแรก

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

def display():
    glClearColor(0,0,0,0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
    glBegin(GL_QUADS)
    glVertex2d(-0.5, -0.5)
    glVertex2d(0.5, -0.5)
    glVertex2d(0.5, 0.5)
    glVertex2d(-0.5, 0.5)
    glEnd()
    
    glutSwapBuffers()

if __name__=="__main__":
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH)
    glutInitWindowSize(512, 512)
    glutCreateWindow("Test 01")
    
    glutDisplayFunc(display)
    
    glutMainLoop()

คำสั่ง OpenGL