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.

