#lang racket (require sgl sgl/gl sgl/gl-vectors) (require racket/gui) ;; argbをrgbaに変換 (define (argb->gl-rgba argb) (let* ((len (bytes-length argb)) (buf (make-gl-ubyte-vector len))) (for ((i (in-range 0 len 4))) (gl-vector-set! buf (+ i 0) (bytes-ref argb (+ i 1))) (gl-vector-set! buf (+ i 1) (bytes-ref argb (+ i 2))) (gl-vector-set! buf (+ i 2) (bytes-ref argb (+ i 3))) (gl-vector-set! buf (+ i 3) (bytes-ref argb (+ i 0)))) buf)) ;; bitmapからargbのバイト列を取得 (define (bm->argb bm) (let* ((w (send bm get-width)) (h (send bm get-height)) (mask (send bm get-loaded-mask)) (buf (make-bytes (* w h 4) 255))) (send bm get-argb-pixels 0 0 w h buf #f) (when mask (send bm get-argb-pixels 0 0 w h buf #t)) buf)) ;; テクスチャ読み込み (define (load-texture path) (gl-enable 'texture-2d) (let* ((bm (make-object bitmap% path)) (w (send bm get-width)) (h (send bm get-height)) (vec (argb->gl-rgba (bm->argb bm))) (tex (gl-vector-ref (glGenTextures 1) 0))) (glBindTexture GL_TEXTURE_2D tex) (glTexParameteri GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_LINEAR) (glTexParameteri GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_LINEAR) (glTexParameteri GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_CLAMP) (glTexParameteri GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_CLAMP) (gluBuild2DMipmaps GL_TEXTURE_2D GL_RGBA w h GL_RGBA GL_UNSIGNED_BYTE vec) tex)) (define current-texture #f) ;; OpenGLによる描画 (define (draw-gl) (gl-clear 'color-buffer-bit) (gl-push-matrix) (glBindTexture GL_TEXTURE_2D current-texture) (let ((q (gl-new-quadric)) (list-id (gl-gen-lists 1))) (gl-quadric-texture q #t) (gl-quadric-draw-style q 'fill) (gl-new-list list-id 'compile) (gl-sphere q 0.5 20 20) (gl-end-list) (gl-call-list list-id)) (gl-pop-matrix) (gl-flush)) (define gl-canvas% (class* canvas% () (inherit with-gl-context swap-gl-buffers) ;; on-paintをオーバーライド (define/override (on-paint) (with-gl-context (lambda () (draw-gl) (swap-gl-buffers)))) ;; on-sizeをオーバーライド (define/override (on-size w h) (with-gl-context (lambda () (gl-viewport 0 0 w h)))) ;; canvas%のスタイルにglを指定 (super-new [style '(gl)]))) (define top-level-frame (new frame% [label "OpenGL test"] [width 400] [height 400])) (define canvas (new gl-canvas% [parent top-level-frame])) (set! current-texture (send canvas with-gl-context (lambda () (load-texture "./texture.jpg")))) (send top-level-frame show #t)
2012年6月21日木曜日
[Racket]OpenGLでテクスチャ
球にテクスチャを貼り付けてみます。掲示板やgistにあったコードを参考にしました。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿