関数型言語の勉強にSICPを読もう - (15) 2章 - 小休止 Gaucheで画面に絵を出そう(Gauche-gl)

計算機プログラムの構造と解釈を読んでScheme勉強していますといっても、いったい何の役に立つの?と思っている人が多いと思います。
僕も実際、考え方はかなり勉強になっていますがまだ仕事やMonaに結びつけることが出来ていません。


こういう状態が長く続くとモヤモヤとするものですが、もうすぐ図形言語の勉強に入るということもあって、「見た目重要」な部分にチャレンジしてみます。
ウィンドウを表示して絵を出したい!


画面描画にはGauche-glを使います。
Gauche-glGaucheからOpen GLライブラリ(もしくは互換ライブラリ)を操作するためのライブラリです。


使い方・インストールはGauche-glのドキュメントを参照されると良いでしょう。


ここではひげぽんの以下のような環境での場合のインストール・動くまでを紹介します。
環境

インストール・動作確認

インストールはとても簡単で

apt-get install gauche-gl

で終了です。


gauche-glにはおなじみの gears サンプルが付属しているので実行してみます。

colinux% gosh /usr/share/doc/gauche-gl/examples/gears.scm
freeglut (/usr/share/doc/gauche-gl/examples/gears.scm): failed to open display ''

これは環境変数DISPLAYが設定されていないだけなので自分の環境に合わせて

export DISPLAY=192.168.99.1

とすれば解決します。


もう一度実行してみましょう。
出来ました。

ウィンドウの表示

GLUTによる「手抜き」OpenGL入門C言語のソースを脳内変換してSchemeで書いてみました。


ウィンドウを表示するだけ。

(use gl)
(use gl.glut)

(define (main args)
  (glut-init args)
  (glut-create-window "create window sample")
  (glut-main-loop)
  )

ウィンドウを塗りつぶす

displayがcallbackになっています。

(define (main args)
  (glut-init args)
  (glut-init-display-mode GLUT_RGBA)
  (glut-create-window "fill window sample")
  (glut-display-func display)
  (init)
  (glut-main-loop)
  )

(define (display)
  (gl-clear GL_COLOR_BUFFER_BIT)
  (gl-flush)
  )

(define (init)
  (gl-clear-color 0.0 0.0 1.0 1.0)
  )

線を引く

(use gl)
(use gl.glut)

(define (main args)
  (glut-init args)
  (glut-init-display-mode GLUT_RGBA)
  (glut-create-window "draw line sample")
  (glut-display-func display)
  (init)
  (glut-main-loop)
  )

(define (display)
  (gl-color 1.0 0.0 0.0)
  (gl-begin GL_LINE_LOOP)
  (gl-vertex -0.9 -0.9)
  (gl-vertex 0.9 -0.9)
  (gl-vertex 0.9 0.9)
  (gl-vertex -0.9 0.9)
  (gl-end)
  (gl-flush)
  )

(define (init)
  (gl-clear-color 0.0 0.0 1.0 1.0)
  )

画像ファイルを読み込む

Gauche-gl : OpenGL binding for Gaucheを読むと、

Function: read-sgi-image filename 

を使えば良さそうなのですが、ちょっとギブ気味。


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404