OpenGLライブラリを使う(CとPythonコードの比較)

これまでPythonOpenGLをどのように使うのか、適当なチュートリアルがなかったのでなかなか理解できないまま、長い時間が経ってしまった。
最近、PyOpenGLを使ったコードをながめていたときに、C言語OpenGLを使うときの関数をそのまま呼んでいるのに気づく。いろいろ試してみて、CとPythonOpenGLを使うコードは大きく変わらない、ことが分かった。
C言語を使うサンプルだけれども、OpenGLを初めて使う人向けのチュートリアルを見つける。
OpenGLプログラミングコース(株式会社エクサ)
例えば、一番簡単なウィンドウを開くCのプログラムは以下のようになる。

/* --- clr.c */
#include <GL/glut.h>

void initialize(void)
{
    glClearColor(0.5f, 0.9f, 0.3f, 1.0f);
}

void display(void)
{
    glClear( GL_COLOR_BUFFER_BIT );
    glFlush();
}

void keyboard( unsigned char c, int x, int y )
{
    if ( c==27 ) exit(0);
}

void reshape(int w, int h)
{
}

int main(int argc, char *argv[])
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGB );
    glutInitWindowPosition( 100, 100 );
    glutInitWindowSize( 500, 400 );
    glutCreateWindow( argv[0] );

    glutDisplayFunc( display );
    glutKeyboardFunc( keyboard );
    glutReshapeFunc( reshape );
    initialize();

    glutMainLoop();
    return 0;
}

同じ処理をPythonで行う場合は、以下のように書く。全く同じ関数を使って、見事に動く。

# --- clr.py
from OpenGL.GL import *
from OpenGL.GLUT import *
#from OpenGL.GLU import *
import sys

ESCAPE = '\033'

def initialize():
    glClearColor(0.5, 0.9, 0.3, 1.0)

def display():
    glClear( GL_COLOR_BUFFER_BIT )
    glFlush()
    
def keyboard(*args):
    if args[0] == ESCAPE:
        sys.exit()

def reshape(w, h):
    pass

def main():
    glutInit(sys.argv)

    glutInitDisplayMode( GLUT_RGB )
    glutInitWindowPosition( 100, 100 )
    glutInitWindowSize( 500, 400 )
    glutCreateWindow( sys.argv[0] )

    glutDisplayFunc( display )
    glutKeyboardFunc( keyboard )
    glutReshapeFunc( reshape )

    initialize()

    glutMainLoop()

print "Hit ESC key to quit."
main()

ウィンドウが開くだけのプログラムだけれど。

今後はCのチュートリアルで勉強する。Cの方が描画速度は速そうだし、Pythonのコードに変換するのは容易だということが分かった。