Python3で始めるOpenGL4

PythonOpenGL
連載一覧 "Python3で始めるOpenGL4"

どうも、サイトでさえこんなに書くのが大変なんだから「本書いている人ってすごいなぁ」って言ってたら、研究室の先輩から「小並感だろ」って言われましたyosiです。

最近はPython教にめっきり入信してしまい、それ以外触らないくらいハマってます。

ゼミの研究ではC#(Unity)、担当しているTA(ティーチングアシスタント:先生のサポートのバイトみたいなもの)ではCの圧力を感じてますが、僕は屈しません。不満ならやらなければいいのに

PythonでモダンなOpenGLが使える。

この感動を伝えるために筆を取りました。

この連載ではPythonによってVAOなど、OpenGLのモダンな機能の説明をコードを交えてできるだけわかりやすく説明していきます。

今回は第1回ということで、その紹介や環境構築をメインにし、最後にプログラムを書いて自分のパソコンで使用できるOpenGLのバージョンを表示します。

そんなことよりも説明を読ませろやって人は、飛ばして連載一覧から次回の内容に進んでください。

Pythonとは?

Pythonとは文法が非常にシンプルでありながら、コードの書きやすさと読みやすさを意識した設計となっており、特に海外で大きなシェアを占めているプログラミング言語です。

主にWeb系で使われていましたが、近年は第3次人工知能ブーム(Deep Learning)で使われることも多く、日本でもメジャーな存在となりました。

ちなみにPythonの歴史は意外と古く、Javaが1996年生まれに対してPythonは1994年生まれです。

Pythonはバージョンが2系と3系があって、互換性がありません(非常に近いんですけどね)。

特別な理由がなければPython 3を使いましょう。

Pythonのメリット

圧倒的に読み書きしやすい設計

CもC++も素晴らしい言語です。

しかし、プログラマーとして高い能力を求められます。

技術は進化し続けますが、人のリソースは有限です。

難解な言語はそれだけでリソースの一部を食い続けます。

Pythonは書きたいように書けて、動かしたいように動いてくれます(誇張広告)。

標準の機能が豊富

PythonはRと並んで統計処理などの研究で使われており、数学関連、データ分析のライブラリがそろってます。

例えば後々紹介しますが、ファイルの読み書きはCと比べると圧倒的なほどにシンプルです。

対話的に実行可能

Pythonはコンソールに1行書き込むだけで、実行してくれます。

これは簡単な確認をしたいときや、動作を追いかけるのに便利です。

この便利さをもっと伝えたいところですが、こういうのは人に聞くより自分で触るのが一番ですので、この辺で抑えときます。

なぜPythonでOpenGLをやるの?

Pythonはお世辞にも実行時間の速い部類ではありません。

OpenGLはGPUにデータと命令を送ることで、高速に処理しています。

ですので、CPUによるPythonの実行時間は多くの場合で問題にならないと思います。

最大限の高速化をしなければならない場面もあるでしょうが、それよりもプログラマーの生産性を優先したい場合も多いと思います。

一応、Pythonには処理を高速化する機能もあります。

準備

PyCharmをインストールする

PyCharmはJetBrains社の発売する開発統合環境で、非常に評判の良い製品です。

無料で使えるコミュニティ版がありますのでそちらをインストールしてください。

もちろん使いたいものが他にあれば、PyCharmでなくともかまいません。

https://www.jetbrains.com/pycharm/

インストール方法には触れません。

何か躓いたら解説しているサイトがたくさんありますのでそちらを参考にしてください。

終わったら新しいプロジェクトを作成します。

僕はOpenglSampleというプロジェクト名にしました。

File -> Setting -> Project:OpenglSample -> Project InterpreterのProject InterpreterがPython2系になっていたら、Python3系に変更します。

歯車マーク->show allから+マークを押して、System Interpreter->InterpreterにPython3系の実行ファイルのパスを入力します。

Python3はPythonの公式サイトからダウンロードできます。

(Anacondaをダウンロードした方が楽だと思います)

下の様に変更できていればOKです。

一度、設定を閉じて Tools -> Python Console を押すと下の方にコンソールが現れます。

そこに

print('Hello World!')

と入力、エンターでうまく実行できればきちんとPython3に設定できていると思います。

ライブラリのインポート

File -> Setting -> Project:OpenglSample -> Project Interpreterの+マークを押してライブラリのパッケージをインストールしていきます。

必要なライブラリは、

  • PyOpenGL
  • glfw (cyglfw3もありますが更新が止まってるようなのでこっちを使いました)
  • PyGLM (OpenGL向けの数学ライブラリです)
  • Pillow (画像読み込みに使います)
  • numpy (OpenGL関連ではないですが必須です)

くらいでしょうか。

下の様に検索してはインストールしていきます。

これで設定は終了のはずです。

GLFW

ちなみにGLUTではなく、GLFWを使用します。

GLUTは90年代で更新が終わっていて、新しい機能をサポートしてなかったりするのが個人的に混乱の元凶な気がします(コンテキストまわりとか)。

その辺、GLFWはかなりメジャーで実績のあるライブラリなので分かりやすく記述できますし、安心感があります。

PCの対応しているOpenGLバージョンの確認とサンプルコード

OpenGLバージョンについて

OpenGLのバージョンは、2018年現在において4.6まで出ています。

1992 OpenGL 1.0
1997 OpenGL 1.1
2006 OpenGL 2.1
2008 OpenGL 3.0
2010 OpenGL 3.3
2010 OpenGL 4.0
2010 OpenGL 4.1
2011 OpenGL 4.2
2012 OpenGL 4.3
2013 OpenGL 4.4
2014 OpenGL 4.5
2017 OpenGL 4.6

詳しく書いてもややこしくなるだけなので、大雑把に説明します。

OpenGL はバージョンアップごとに機能追加や削除を繰り返していますが、バージョン1.xの時はglPushMatrixなど古の機能が存在していた時代です。

簡単に書ける反面、データを1つ1つCPUからGPUに渡すために実行速度が遅く、応用が難しいものですが、なぜか未だに大学で教えているところもあります(歴史や仕組みに触れるという意味では悪くないのかもしれません)。

2.xではGLSLというシェーダー機能、データを一括してGPUに渡しておくためのVBOが追加され、増殖しすぎた古の関数たちを表立っては削除しました。

3.xでは長ったらしいVBOを簡潔に記述できるVAOが実装されました。

4.xに入ってからはOpenGLの進化は加速し、次々と最新の機能を追加しています。

OpenGLは一応バージョンの互換性を保っているため、古いバージョンのコードを動かすことができます。

また、OpenGLはパソコンによって対応しているバージョンが違います。

パソコンのグラフィックドライバーが3.3までしか対応してなければ、4.0以降を使うことはできません。

バージョンはglGetString(GL_VERSION)で取得することができます。

対応するOpenGLバージョンを取得する

File -> New -> Python File から新しいPythonファイルを作りましょう。

Tools -> Python Console でコンソールを表示して、直接Pythonコードを入力しても構いません。

ソースコード

# OpenGLとGLFWをインポートします
from OpenGL.GL import *
import glfw


def main():
    # GLFW初期化
    if not glfw.init():
        return

    # ウィンドウを作成
    window = glfw.create_window(640, 480, 'Hello World', None, None)
    if not window:
        glfw.terminate()
        print('Failed to create window')
        return

    # コンテキストを作成します
    glfw.make_context_current(window)

    # OpenGLのバージョン等を表示します
    print('Vendor :', glGetString(GL_VENDOR))
    print('GPU :', glGetString(GL_RENDERER))
    print('OpenGL version :', glGetString(GL_VERSION))

    # ウィンドウを破棄してGLFWを終了します
    glfw.destroy_window(window)
    glfw.terminate()


# Pythonのメイン関数はこんな感じで書きます
if __name__ == "__main__":
    main()

結果

Vendor : b'Intel'
GPU : b'Intel(R) HD Graphics 520'
OpenGL version b'4.4.0 - Build 21.20.16.4627'

僕の環境ではバージョン4.4までは使えるようです。

これからバージョンは4.0を中心にやっていくと思いますが、3.xまでにしか対応してなかった人にも参考になる内容が多いと思います。

次回からは本格的にOpenGLの解説やプログラムを書いていこうと思います。

それでは今回はこの辺で。

main.zip

連載一覧 "Python3で始めるOpenGL4"

あわせて読みたい