1. はじめに
本記事ではPythonでOpenGLの基本をまとめる。なぜPythonですか?
Cmake含めて、Cの環境設定はしんどいので(長年間経験したので)、Pythonを選択した。
また、PythonでやるとOS環境など無視して、どのOSでもすぐできるようにと考える。
目的はあくまでC言語の勉強ではなく、CGプログラミングを勉強すること。
もし、Cでやりたいであれば、 和歌山大学の床井浩平先生による GLUTによる『手抜き』OpenGL入門をが参考にしてください。
また、以下のgithubですべてのコードを公開する予定。
https://github.com/fermanda/Python_CG_Programming
1.1 環境
- Windows 11
- VS Code
- Python 3.8 (venv仮想環境)
1.2 セットアップ
まず、必要なパッケージをインストールする。
pip install PyOpenGL PyOpenGL_accelerate glfw
以上。
Pythonはめちゃくちゃ便利です。
では、ささっと本番のCGプログラミングを開始。
その前、PyOpenGLのsyntaxは、なんとC言語とまったく一緒!
なので、床井先生の「GLUTによる『手抜き』OpenGL入門」は参考にします。
2. ウィンドウ
2.1 ウィンドウ生成
ウィンドウ作成方法はいくらでもある。しかし今回はGLUTよりGLFWを利用する。
一つの理由はGLFWの開発は進めている。
import glfw
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def main():
# glfwを初期化する
if not glfw.init():
return
# "Hello World"のタイトルで640 × 480のウィンドウ作成する
window = glfw.create_window(640, 480, "Hello World", None, None)
if not window:
glfw.terminate()
return
# 作成したウィンドウをメインにする(レンダリングのためとか)
glfw.make_context_current(window)
# ウィンドウ開ける状態に以下のプロセスをループする。
while not glfw.window_should_close(window):
# ここからレンダリングプロセスをバッファーで行う
# レンダリングされているバッファーを当たれしいバッファーと交換する。
glfw.swap_buffers(window)
# イベント(キーなどの入力)を認識と集まる。
glfw.poll_events()
glfw.terminate()
if __name__ == "__main__":
main()
上のコードで新しい640 × 480のウィンドウを作成する。実行したら以下の結果になる。
2.2 ウィンドウの調整する
ウィンドウの背景の色も変われる。
glClearColor(R, G, B, Alpha)
を0.0から1.0の範囲で以下のように設定する。
...
while not glfw.window_should_close(window):
# ここからレンダリングプロセスをバッファーで行う
# ウインドウの色変更する
glClearColor(0.0, 0.0, 1.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
...
実行したら、以下の結果となる。
3. 2D図形
次は2D図形を描くプログラム作りましょう。
3.1 2D図形を描く
以下のコードで四角の2D図形を描けた。
import glfw
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def main():
if not glfw.init():
return
window = glfw.create_window(640, 480, "Hello World", None, None)
if not window:
glfw.terminate()
return
glfw.make_context_current(window)
while not glfw.window_should_close(window):
# ここからレンダリングプロセスをバッファーで行う
glClear(GL_COLOR_BUFFER_BIT)
glBegin(GL_LINE_LOOP)
glVertex2d(-0.9, -0.9)
glVertex2d(0.9, -0.9)
glVertex2d(0.9, 0.9)
glVertex2d(-0.9, 0.9)
glEnd()
glFlush()
glfw.swap_buffers(window)
glfw.poll_events()
glfw.terminate()
if __name__ == "__main__":
main()
上のコードはほどんど前と一緒ですが、注目すべき部分はレンダリングのところです。
...
glBegin(GL_LINE_LOOP)
glVertex2d(-0.9, -0.9)
glVertex2d(0.9, -0.9)
glVertex2d(0.9, 0.9)
glVertex2d(-0.9, 0.9)
glEnd()
glFlush()
...
glBeginのパラメタ以下の画像で説明する。
図参考:https://tokoik.github.io/opengl/libglut.html
上のプログラムはGL_LINE_LOOP
を使って、四角を描けた。描くためにはglBegin()
で開始、glEnd()
で終了する。glFlush()
を実行したら、以前のすべてのglコマンドを実行する。
3.2 カラーを入れよう
白い薄い四角がレンダーされたが、あまり魅力じゃないので、色を付けてみよう。
vertexを描く前に色を指定する。
...
glBegin(GL_LINE_LOOP)
glColor3d(1.0, 1.0, 0.0) # ここで色を指定する
glVertex2d(-0.9, -0.9)
glVertex2d(0.9, -0.9)
glVertex2d(0.9, 0.9)
glVertex2d(-0.9, 0.9)
glEnd()
glFlush()
...
上のコードを実行したら以下の結果となる。
あれ?edgeだけ色がかわるね?
それはglBegin()
がまだGL_LINE_LOOP
だからです。
四角全体を色を付けたりするためにはGL_POLYGON
に変更しよう。
GL_POLYGON
に変更と実行すると以下の結果となる。
色も、各頂点に指定できる。例えば以下のように指定しよう。
...
glBegin(GL_POLYGON)
glColor3d(1.0, 1.0, 0.0)
glVertex2d(-0.9, -0.9)
glColor3d(1.0, 0.0, 1.0)
glVertex2d(0.9, -0.9)
glColor3d(0.0, 1.0, 1.0)
glVertex2d(0.9, 0.9)
glColor3d(1.0, 1.0, 1.0)
glVertex2d(-0.9, 0.9)
glEnd()
...
上のコードを実行したら以下の結果となる。