2009/04/11

OpenGL の Hello World!

春ですね。何かを始めるにはいい季節です。何も始めないにしてもいい季節です。今月は誕生日もあります。

ということで OpenGL でも勉強してみる。昔々に買った『OpenGLプログラミングガイド 第2版』を読みながら。いまは第5版が出てるのか。それにしてもお高いものですね。よくこんな高い本買ったね。> 昔の私

もちろん C を使ったりはせず Common Lisp の cl-opengl を使う。

cl-opengl では GLUT が CLOS で実装されている。それを使って『OpenGLプログラミングガイド 第2版』の最初のサンプルを書いてみたのが下のコード。

glut:window を継承した窓クラスを定義。その描画は glut:display メソッドで。 glut:display-window は窓表示前の初期化処理。 glut:reshape は窓のサイズ変更時に呼ばれるが、今回は使わない。窓のインスタンスを作って、glut:display-window を呼べば表示さる。あと glut:keyboard でエスケープキーか q が押されたら窓が閉じるようにしてある。

ortho とか何のことだかまださっぱり分からないけど、なかなか楽しい。

本の中では C で書いてあるこのコードが hello.c となっていた。四角いポリゴンを書くのが OpenGL の Hello World! ということか。

(eval-when (:compile-toplevel :load-toplevel :execute)
(require :cl-glut))

(defclass test-window (glut:window)
()
(:default-initargs :title "Test" ; title 日本語はばける。
:mode '(:single :rgb :depth)))

(defmethod glut:keyboard ((window test-window) key x y)
(declare (ignore x y))
(case key
((#\Esc #\q) (glut:destroy-current-window))))

(defmethod glut:display-window :before ((w test-window))
(gl:clear-color 0 0 0 0) ; 次の clear で使う色
(gl:matrix-mode :projection)
(gl:load-identity)
(gl:ortho 0 1 0 1 -1 1)) ; 座標系と写像の指定?

(defmethod glut:display ((window test-window))
(gl:clear :color-buffer-bit) ; クリア
(%gl:color-3f (random 1.0) (random 1.0) (random 1.0)) ; 描画に使う色
(gl:begin :polygon) ; end までがポリゴン描画
(%gl:vertex-3f 0.25 0.25 0)
(%gl:vertex-3f 0.75 0.25 0)
(%gl:vertex-3f 0.75 0.75 0)
(%gl:vertex-3f 0.25 0.75 0)
(gl:end)
(gl:flush)) ; 実行

;;(defmethod glut:reshape ((window test-window) width height)
;; )

(defun run-test ()
(glut:display-window (make-instance 'test-window)))

;;(run-test)

0 件のコメント: