Hi All,

I am looking into opengl and have so far learned to draw directly to the
screen.
However I'd like to do some offscreen rendering and have therefore tried to
use a framebuffer.
The program below does the following:

1. Makes a framebuffer
2. Adds a texture (a plt logo)
3. Draws a blue triangle on top of the logo
4. Switches to the screen
5. Draw a green triangle
6. Copies the logo with the blue triangle to the screen.

My problem is that the blue triangle is missing in the result.

The result:      https://imgur.com/NBJf2DG
See program below.

Ideas welcome.

/Jens Axel



#lang racket/gui
(require opengl opengl/util ffi/vector)

(define logo-texture #f)
(define (load-logo-texture)
  (unless logo-texture
    (set! logo-texture (load-texture "plt-logo-red-gradient.png" #:repeat
'both)))
  logo-texture)

(define (clear r g b a)
  (glClearColor r g b a)
  (glClear (bitwise-ior GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT)))

(define (set-color r g b)
  (glColor3f r g b))

(define (reset-color)
  (set-color 1. 1. 1.))

(define (draw-triangle x1 y1 x2 y2 x3 y3)
  (glBegin GL_TRIANGLES)
  (glVertex3d  x1 y1  0.)
  (glVertex3d  x2 y2  0.)
  (glVertex3d  x3 y3  0.)
  (glEnd))

(define (example)
  ; make framebuffer
  (define fbo-ids (glGenFramebuffers 1))     ; this returns a vector of
names
  (define fbo     (u32vector-ref fbo-ids 0)) ; get the first framebuffer
  ; swith to the new framebuffer
  (glBindFramebuffer GL_FRAMEBUFFER fbo)  ; initialize framebuffer object
  ; load logo texture if needed
  (load-logo-texture) (unless logo-texture (error))
  (glFramebufferTexture2D GL_FRAMEBUFFER GL_COLOR_ATTACHMENT0 GL_TEXTURE_2D
logo-texture 0)
  (define status (glCheckFramebufferStatus GL_FRAMEBUFFER_EXT))
  (define status-complete? (= status GL_FRAMEBUFFER_COMPLETE_EXT))

  ; Draw a blue triangle  ***this is the part that isn't working***
  (glDrawBuffer GL_COLOR_ATTACHMENT0)   ; draw to color attachment 0
  (glDisable    GL_TEXTURE_2D)          ; do not use the texture when
drawing the triangle
  (clear     0.0 0.0 1.0 1.0)
  (set-color 0.0 1.0 0.0)
  (glDisable GL_BLEND)
  (draw-triangle -1.0 0.0  1.0 0.0  1.0 1.0)

  ; switch to screen framebuffer
  (glBindFramebuffer GL_FRAMEBUFFER 0)
  ; red background
  (clear     1.0 0.0 0.0 0.0)
  ; green triangle
  (set-color 0.0 1.0 0.0) (draw-triangle 0.0 0.0  1.0 0.0  0.0 1.0)
  ; Copy logo with blue triangle to screen
  (reset-color)
  (glEnable GL_TEXTURE_2D)
  (glEnable GL_BLEND)
  (glBlendFunc GL_ONE GL_ONE_MINUS_SRC_ALPHA) ; settings for pre-multiplied
alpha.
  (define vertex-array   (f64vector -0.5 -0.5   0.5 -0.5 0.5  0.5  -0.5
0.5))
  (define texcoord-array (s16vector  0    2     2    2   2    0     0    0))
  (let-values (((type cptr) (gl-vector->type/cpointer vertex-array)))
    (glVertexPointer 2 type 0 cptr))
  (let-values (((type cptr) (gl-vector->type/cpointer texcoord-array)))
    (glTexCoordPointer 2 type 0 cptr))
  (glEnableClientState GL_VERTEX_ARRAY)
  (glEnableClientState GL_TEXTURE_COORD_ARRAY)

  (glDrawArrays GL_QUADS 0 4)
  (glDisableClientState GL_TEXTURE_COORD_ARRAY)
  (glDisableClientState GL_VERTEX_ARRAY)
  (glDisable GL_TEXTURE_2D)
  (void))

;;;
;;; MODEL
;;;

(define frames-per-second 60.)
(define milliseconds-per-frame (/ 1000. frames-per-second))
(define time 0.)

(define (on-tick)
  (set! time (+ time 1.))
  (send gl on-paint))

;;;
;;; GUI
;;;

(define (resize w h)
  (glViewport 0 0 w h))

(define (example2)
  (define v (* 2. pi (/ time 60)))
  (define c (cos v))
  (define s (sin v))

  (glClearColor 0.0 0.0 0.0 0.0)
  (glClear GL_COLOR_BUFFER_BIT)

  (glBegin GL_TRIANGLES)
  (glColor3f    c   0.   0.)
  (glVertex3d   c   0    0)
  (glColor3f    0.   s   0.)
  (glVertex3d   0.   s   0.)
  (glColor3f    0.   0.   1.)
  (glVertex3d  -1.  -1.   0.)
  (glEnd))

(define my-canvas%
  (class* canvas% ()
    (inherit with-gl-context swap-gl-buffers)
    (define/override (on-paint)             (with-gl-context (λ() (example)
(swap-gl-buffers))))
    (define/override (on-size width height) (with-gl-context (λ() (resize
width height) (on-paint))))
    (super-instantiate () (style '(gl)))))

(define win (new frame% [label "Racket Rosetta Code OpenGL example"]
                 [min-width 200] [min-height 200]))
(define gl  (new my-canvas% [parent win]))

(new timer%
     [interval (exact-floor milliseconds-per-frame)] ; in milliseconds
     [notify-callback on-tick])

(send win show #t)

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to