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 件のコメント:
コメントを投稿