我尝试将代码从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)?
答案 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)
应解决问题的这一部分。