0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonでOpenGLをはじめる

Last updated at Posted at 2025-08-03

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の開発は進めている。

create_window.py
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のウィンドウを作成する。実行したら以下の結果になる。

image.png

2.2 ウィンドウの調整する

ウィンドウの背景の色も変われる。
glClearColor(R, G, B, Alpha)を0.0から1.0の範囲で以下のように設定する。

create_window.py
...
    while not glfw.window_should_close(window):
        # ここからレンダリングプロセスをバッファーで行う
        
        # ウインドウの色変更する
        glClearColor(0.0, 0.0, 1.0, 1.0)
        glClear(GL_COLOR_BUFFER_BIT)
...

実行したら、以下の結果となる。

image.png

3. 2D図形

次は2D図形を描くプログラム作りましょう。

3.1 2D図形を描く

以下のコードで四角の2D図形を描けた。

draw_2d.py
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のパラメタ以下の画像で説明する。

image.png
図参考:https://tokoik.github.io/opengl/libglut.html

上のプログラムはGL_LINE_LOOPを使って、四角を描けた。描くためにはglBegin()で開始、glEnd()で終了する。glFlush()を実行したら、以前のすべてのglコマンドを実行する。

コードを実行したら、以下の結果となる。
image.png

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()
...

上のコードを実行したら以下の結果となる。

image.png

あれ?edgeだけ色がかわるね?
それはglBegin()がまだGL_LINE_LOOPだからです。
四角全体を色を付けたりするためにはGL_POLYGONに変更しよう。
GL_POLYGONに変更と実行すると以下の結果となる。

image.png

色も、各頂点に指定できる。例えば以下のように指定しよう。

...
        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()
...

上のコードを実行したら以下の結果となる。

image.png

4. 3D図形

5. ビューポート

6. 操作と入力

7. アニメーション

つづき準備中

参考資料

  1. Learn OpenGL - Graphics Programming
  2. GLUTによる「手抜き」OpenGL入門
  3. OpenGL Documentation
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?