如何使用SBCL安装CL-OpenGL?

5

我想知道如何在64位Windows 8笔记本上为SBCL安装OpenGL?我已经使用了quicklisp和quickload,但是当我在程序中实际使用它时,会出现以下错误:

; compilation unit finished
;   Undefined functions:
;     DRAW-FRAME INIT-GL
;   caught 2 STYLE-WARNING conditions

这是我的代码:

(require 'cl-opengl)
(require 'cl-glu)
(require 'lispbuilder-sdl)

(defun main-loop ()
  (sdl:with-init ()
    (sdl:window 800 800
        :title-caption "OpenGL Test"
        :opengl t
        :opengl-attributes '((:sdl-gl-doublebuffer 1)
                             (:sdl-gl-depth-size 16)))
    (setf (sdl:frame-rate) 20)

    (init-gl)
    (draw-frame)
    (sdl:update-display)

    (sdl:with-events ()
      (:quit-event () t)
      (:video-expose-event ()
        (sdl:update-display))
      (:idle ()
        (draw-frame)
        (sdl:update-display)))))

1
如果你不解释你在做什么以及你得到了什么,那么没有人能够帮助你。我认为这只是一种风格警告,而不是一个错误。 - sheikh_anton
1
@coredump,虽然这些消息确实是警告,但代码中的未定义函数绝不是什么好事。 - Mark Karpov
1
@Mark,它不能在另一个地方定义,并且在此编译单元中不声明为函数吗? - sheikh_anton
@coredump,我已经包含了我的代码。 - Fderal
3
init-gl和draw-frame是什么?它们是cl-opengl或其他库的一部分吗?如果是,为什么它们没有以包名称(例如gl:或sdl:)作为前缀? - cybevnm
正如@cybevnm所说,您必须在draw-frame和init-gl前缀中加入包名称,或通过调用use-package将其包含在命名空间中。 - sheikh_anton
2个回答

2

我快速浏览了你的代码似乎来自于这个网页

看起来编译器没有说谎,(init-gl)(draw-frame)未定义。

据我所知,上述页面的作者后来包括了一个如下所示的(draw-frame)定义:

(defun draw-frame (rotx roty rotz) (gl:matrix-mode :modelview) (gl:push-matrix) (gl:translate 0.5 0.5 0.5) (gl:rotate rotx 1 0 0) (gl:rotate roty 0 1 0) (gl:rotate rotz 0 0 1) (gl:translate -0.5 -0.5 -0.5) (draw-figure +cube-vertices+ +cube-faces+) (gl:pop-matrix))

然而,(init-gl)似乎被重命名为(start),其开始部分为:

(defun start () (let ((rotx 0) (roty 0) (rotz 0))

作者将(init-gl)描述为设置“视图参数、光照、剔除、模型视图矩阵等”,看起来他的函数(start)正好实现了这一目标。

顺便说一句,cybevnm问了所有正确的问题,回答这些问题可能会让你得出类似的结论。

干杯!


1
你需要安装quicklisp。然后只需执行(ql:quickload '<system-name>)即可加载所有软件包。你正在使用的所有三个系统都可以通过quicklisp获得,还有更多其他的系统可供使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接