Blending (Redbook Ch6)

Bart Botta 00003b at gmail.com
Sat Nov 16 20:16:21 UTC 2013


On Sat, Nov 16, 2013 at 12:49 PM, Greg Bennett <gwbennett at sentex.ca> wrote:
>
> ;; Adding the (defmethod keyboard ...) form and running
> ;; (gb-blend) produces that yellow window, the keys a,s,r,m,x
> ;; have no effect on it at all.
>
> ;; The x in its top right kills it. Esc kills it too and
> ;; leads to this in the message
> ;; window of what was the repl:
> ;+ Lisp connection closed unexpectedly: connection broken
> ;+ by remote peer
>
When dealing with non-lisp libraries (like glut), one common cause of
the lisp dieing unexpectedly like that is libraries that handle errors
by just exiting completely. If you check the *inferior-lisp* buffer in
emacs, it might have printed out an error message first. In this case,
I get "freeglut (SBCL): ERROR: Function <glutPostRedisplay> called
with no current window defined.", which suggests the problem is the
call to (glut:post-redisplay) after calling
(glut:destroy-current-window).


> ;; I said Typically, because just ONCE the code without
> ;; the keyboard method produced a yellow pane with a white
> ;; square in its centre.

The time with the white square you probably forgot to define the
RESHAPE method, which looks like it doesn't quite match the drawing
code you have.


> ;; We seem to need this reshape method
> ;; in order that anything show on the screen
> (defmethod glut:reshape ((w blender-window) width height)
>   (gl:viewport 0 0 width height)
>   (gl:matrix-mode :projection)
>   (gl:load-identity)

this part looks wrong:

>   (glu:ortho-2d 0 width 0 height))

Should probably either be removed, or be (glu:ortho-2d -1 1 -1 1)
which I think would be the same as the default.
(glu:ortho-2d 0 width 0 height) sets the projection so that 0,0 is at
the corner of the window, and each pixel is 1 unit. The DISPLAY method
draws a square from -0.5 to 0.5, so it would cover half a pixel at the
corner with that projection.

> ;; There is it in the top left of the screen
> ;; correct title, solid yellow background.
> ;; (? Should there have been a yellow square in the middle ?)

Should have been a white square on yellow background: background is
yellow (1,1,0), and square is blue (0,0,1), and the blend mode is ADD
by default, without alpha, so result is white (1,1,1).

> ;; The keyboard method to drive the blender options
> ;; in the OpenGL P G P231
> (defmethod glut:keyboard ((w blender-window) key x y)
>   (declare (ignore x y))
>   (case key
>     ((#\a) (gl:blend-equation :func-add))
>     ((#\s) (gl:blend-equation :func-subtract))
>     ((#\r) (gl:blend-equation :func-reverse-subtract))
>     ((#\m) (gl:blend-equation :min))
>     ((#\x) (gl:blend-equation :max))
>     ((#\Esc) (glut:destroy-current-window))
>     )

don't call this after destroying the window:

>   (glut:post-redisplay)
> )



More information about the cl-opengl-devel mailing list