使用带着色器的cl-opengl

时间:2015-03-30 19:48:27

标签: opengl glsl common-lisp slime

我尝试将代码从this现代opengl教程转换为cl,但如果我启动程序,则会打开一个没有内容的新窗口,我必须重新启动整个窗口管理器,所以它很难调试。

我的代码(使用sdl2代替过剩):

(defun to-gl-array (seq type
                    &aux
                      (length (length seq))
                      (array (gl:alloc-gl-array type length)))
  (dotimes (i length)
    (setf (gl:glaref array i) (aref seq i))))

(defvar *vs* (gl:create-shader :vertex-shader))
(defvar *vs-source*
  "#version 330

attribute vec2 c2d;
void main(void) {
  gl_Position = vec4(c2d, 0.0, 1.0);
}
")

(defvar *fs* (gl:create-shader :fragment-shader))
(defvar *fs-source*
  "#version 330

void main(void) {
  gl_FragColor[0] = 0.0;
  gl_FragColor[1] = 0.0;
  gl_FragColor[2] = 1.0;
}
")

(defvar *c2d*)

(defvar *program* (gl:create-program))

(defun init ()
  (gl:shader-source *vs* *vs-source*)
  (gl:compile-shader *vs*)
  (gl:shader-source *fs* *fs-source*)
  (gl:compile-shader *fs*)
  (gl:attach-shader *program* *vs*)
  (gl:attach-shader *program* *fs*)
  (gl:link-program *program*)
  (setq *c2d* (gl:get-attrib-location *program* "c2d")))

(defun run (&aux triangle)
  (gl:use-program *program*)
  (gl:enable-vertex-attrib-array *c2d*)
  (setq triangle (to-gl-array #(0.0 768.0
                                1280.0 768.0
                                640.0 0.0) :float))
  (gl:vertex-attrib-pointer *c2d* 2 :float nil 0 triangle)
  (gl:free-gl-array triangle)
  (gl:draw-arrays :triangles 0 3)
  (gl:disable-vertex-attrib-array *c2d*))

(defun free ()
  (gl:delete-program *program*))


(defun start ()
  (init)
  (sdl2:with-init (:everything)
    (sdl2:with-window (win :w 1280 :h 768 :flags '(:shown :opengl :resizable))
      (sdl2:with-gl-context (gl-context win)
        (gl:ortho 0 1280 768 0 -1 1)
        (gl:clear-color 0 0 0 1)
        (sdl2:with-event-loop (:method :poll)
          (:quit () t)
          (:windowevent (:data1 w :data2 h)
            (sdl2:set-window-size win w h))
          (:keydown (:keysym key)
            (and (sdl2:scancode= (sdl2:scancode-value key) :scancode-escape)
                 (sdl2:push-event :quit)))
          (:idle ()
            (gl:clear :color-buffer)
            (gl:color 0 0 1)
            (run)
            (gl:flush)
            (sdl2:gl-swap-window win))
          (finish-output)))))
  (free))

让(现代)opengl使用cl的最佳方法是什么? 我应该使用另一个教程(可能是常见的lisp?我没有找到一个)或其他libs(例如lispy glsl或不是sdl2)?

2 个答案:

答案 0 :(得分:0)

我觉得你不想打电话给gl-free-array。您没有使用VBO,因此OpenGL需要CPU端内存来渲染三角形。您应该将三角形数组放在一个全局变量中。

答案 1 :(得分:0)

无法评论,所以这将是一个答案(是的,我知道这个问题已经半岁了)。 您的主要问题似乎源自您的to-gl-array,它在填充后实际丢弃了数组 - 将NIL返回到您的triangle

(defun to-gl-array (seq type
                &aux
                  (length (length seq))
                  (array (gl:alloc-gl-array type length)))
   (dotimes (i length)
   (setf (gl:glaref array i) (aref seq i)))
   array) 

应解决问题的这一部分。