2015-03-30 56 views
3

我试图代码this现代的OpenGL教程转换成CL,但如果我启动我的程序,没有什么事情一个新窗口打开,我必须重新启动整个窗口管理器,所以很难调试。使用CL-的OpenGL着色器

我的代码(使用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?我没有找到一个)或其他库(例如lispy glsl或不sdl2)?

回答

0

我不认为你要拨打免费GL-阵列。您不使用VBO,因此OpenGL需要CPU端内存来渲染三角形。你应该把三角形数组放在一个全局变量中。

+0

它没有工作。 – 2015-03-31 09:23:22

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) 

应该修复这部分问题。