2009/04/19

立体っぽくなった

ようやく照光処理まできた。『OpenGLプログラミングガイド 第2版』の第5章だ。

cl-opengl は作りがいいように感じる。素直に OpengGL の関数が使えるし、ちょっと面倒なところはちゃんとラッパーが用意されてる。今回の gl:material とか。

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

(defclass light-window (glut:window)
()
(:default-initargs :title "Light"
:mode '(:single :rgb :depth)
:width 500 :height 500 :pos-x 300 :pos-y 300))

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

(defmethod glut:display-window :before ((window light-window))
(gl:clear-color 0 0 0 0)
(%gl:shade-model :smooth)

(gl:material :front :specular '(1 1 1 1))
(gl:material :front :shininess 50)
(gl:light :light0 :position '(1 1 1 0))

(gl:enable :lighting :light0 :depth-test))

(defmethod glut:display ((window light-window))
(gl:clear :color-buffer-bit :depth-buffer-bit)
(glut:solid-sphere 1 200 160)
(%gl:flush))

(defmethod glut:reshape ((window light-window) w h)
(%gl:viewport 0 0 w h)
(%gl:matrix-mode :projection)
(%gl:load-identity)
(if (<= w h)
(%gl:ortho -1.5 1.5 (* -1.5 (/ h w))
(* 1.5 (/ h w)) -10 10)
(%gl:ortho (* -1.5 (/ w h)) (* 1.5 (/ w h)) -1.5
1.5 -10 10))
(%gl:matrix-mode :modelview)
(%gl:load-identity))

;;(glut:display-window (make-instance 'light-window))

0 件のコメント: