FFIの実用例: OpenGLを利用する

SML# のFFIの機能を用いることで,既存のC言語用のライブラリを直接かつ簡単に利用することができる.ここでは既存のライブラリのうち,OpenGLを取り上げる.

glutサンプル(配布ソースのsample/glutディレクトリ)は,OpenGLおよびGLUTを用いて2つの回転する立方体を3Dアニメーションで表示するプログラムである.

スクリーンショット

OpenGLやGLUTライブラリには,倍精度浮動小数点数や単精度浮動小数点数,イベント処理のためのコールバック関数などを受け取る関数が多数存在する.SML#では,このような関数も特殊なプログラムを書くことなく,ただC言語の関数宣言に合わせて_import特殊構文を書くだけ利用可能となる._importを用いてOpenGL関連のAPIをバインドするコード例を以下に示す.

val glMaterialfv =
    DynamicLink.dlsym (libgl, "glMaterialfv")
    : _import (word, word, float * float * float * float) -> unit

val gluLookAt =
    DynamicLink.dlsym (libglu, "gluLookAt")
    : _import (real, real, real, real, real, real, real, real, real) -> unit

val glutDisplayFunc =
    DynamicLink.dlsym (libglut, "glutDisplayFunc")
    : _import (()->unit) -> unit

サンプルプログラムの実行方法

このサンプルプログラムは実験的なCConfigライブラリを使用しているため,実行するにはOpenGLライブラリがインストールされている場所などにに合わせて環境変数を適宜設定する必要がある.

UNIX系OSでの例:

env CPPFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib smlsharp cube.sml

Mac OS Xでの例:

env LDD='otool -L' smlsharp cube.sml

Cygwinでの例:

env CPPFLAGS=-I/usr/X11R6/include LDFLAGS=-L/usr/X11R6/lib \
    LIBNAME_SUFFIX=.dll LDD=cygcheck ARCSEP='\' smlsharp cube.sml

MinGWでの実行

最近のWindowsにはOpenGLライブラリが標準で添付されている(opengl32.dll, glu32.dll).GLUTライブラリはOpenGLのWebサイトから入手できる.ただし,現在のCConfigライブラリはMinGWに対応しておらず,またWindows APIは関数の呼び出し規約が一般のCの関数と異なるため(stdcall),このサンプルプログラムを実行するにはlibglut.smlを若干書き換える必要がある.

Last modified:2007/03/30 13:16:33
Keyword(s):
References:[プログラミング例]