本章の構成

本章は PyOpenGL の基本的な機能の動作を実演する Python スクリプトを、紹介・解説していくという構成にする予定だ。その他にも補助的なモジュールやクラスの作成を伴うことがわかったので、それらの紹介・解説も行いたい。どうやら本章の分量が多くなりそうなので、ここで前もって本章の全体の構成を示す。

Note

特に断らない限り、以降のテキストおよびコード片においては、各種 import を次のようにしたものと仮定している。

import numpy as np
import OpenGL.GL as GL
import OpenGL.GLU as GLU
import OpenGL.GLUT as GLUT

PyOpenGL プログラム共通の注意事項およびコツ

PyOpenGL プログラムに頻出する技法・注意点
C/C++ で OpenGL を利用するプログラムを書くことと、 Python で PyOpenGL を利用するプログラムを書くこととの相違点をいくつか挙げる。

PyOpenGL プログラムのための土台となるクラスを実装する

単純な PyOpenGL のプログラムは、どれも構造と手続きが似通ったものになる。本章ではサンプルプログラムを多数書くつもりでいるので、共通しているプログラム要素を、オブジェクト指向プログラミング的着想によってクラスとしてカプセル化しておく。

クラス AppBase の実装
すべてのサンプルプログラムに共通する機能をカプセル化したクラスを設計・実装するために、新旧スタイルどちらにも共通する部分をカプセル化したクラスを設計・実装する。
クラス DeprecatedApp の実装
昔作成した PyOpenGL プログラムをリファクタリングするための基底クラスを、クラス AppBase のサブクラスとして設計、実装する。この基底クラスは、最近の OpenGL の仕様書で deprecated と認定されている機能群で書かれたプログラムのリファクタリング用とする。
クラス ModernApp の実装
最近の OpenGL の仕様に基づいた機能でプログラムを書くときに派生させるための基底クラスを、クラス AppBase のサブクラスとして設計・実装する。 GLSL を利用するプログラムは、すべてこのクラスからのサブクラスとして実装したい。

関連クラス・関数群を実装する

共通しているプログラム要素はそれだけでは収まらない。

ベクトル・行列・座標変換
最近の OpenGL では行列操作に関する関数が全滅 (Mark Segal, Kurt Akeley. The OpenGL Graphics System: A Specification (Version 3.1). p. 295. 2009) しているので、簡単な一次・アフィン変換、透視射影変換等を処理する機能をこちらで用意する。そのため、ひとつモジュールを作る。
回転とズーム
クラス AppBase が制御するウィンドウ上でのマウスイベントに応じて、シーンのズームや回転を動的に実現するためのクラス群の定義を行うモジュールを作る。
シェーダープログラム管理クラス
GLSL オブジェクトの生成と破棄の管理を行うクラス ProgramManager を設計・実装する。このクラスのオブジェクトをクラス ModernBase にメンバーデータとして持たせる。

サンプルプログラムの紹介と解説

ここまで長かったが、これからが本章の主題となる内容なのだ。

画像ファイルを扱う
クラス DeprecatedApp のサブクラスを定義して、テクスチャー機能を試す。 PNG ファイルから生成する方法と、日本語一文字から生成する方法を実験する。
単純なシェーダープログラムの作成
クラス ModernBase のサブクラスを定義して、シェーダーを利用してみる。