2011-07-08 9 views
1

私は一連の他のイメージで円を塗り潰そうとしていて、それらのイメージを円でマスクしています。なぜこれが動作していないのか分かりますが、それを修正する方法については解決策がありません。次のようにopenGLテクスチャマスキング

(処理を使用して)私の描画コードは次のとおりです。

PGraphicsOpenGL pgl = (PGraphicsOpenGL) g; // g may change 
    // This fixes the overlap issue 
    gl.glDisable(GL.GL_DEPTH_TEST); 
    // Turn on the blend mode 
    gl.glEnable(GL.GL_BLEND); 

    // Define the blend mode 
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 

    // draw the backgroud 
    fill(200,200,200); 
    rect(0, 0, width, height); 

    // cut out the circle 
    gl.glBlendFunc(GL.GL_ZERO, GL.GL_ONE_MINUS_SRC_ALPHA); 
    tint(0,0,0,255); 
    image(circle, 0, 0); 

    // draw the circle 
    gl.glBlendFunc(GL.GL_ONE_MINUS_DST_ALPHA, GL.GL_ONE); 
    tint(140,0,0,255); 
    image(circle, 0, 100); 

    gl.glBlendFunc(GL.GL_ONE_MINUS_DST_ALPHA, GL.GL_ONE); 
    tint(140,0,140,255); 
    image(circle, 0, 0); 

私は私が望む効果を記述するように見えるhttp://bigbucketsoftware.com/2010/10/04/how-to-blend-an-8-bit-slide-to-unlock-widget/の指示に従ってきました。私は同様の結果でこれをiPhoneで試してみました。ここで

は私が起こることを期待していたもので、何が起こっ: problem image

答えて

2

問題は、透明領域をどのように扱うかでなければなりません。 GL_ALPHA_TESTを有効にすることができます。

写真が単純なままであれば、三角形で描くことができます。

enter image description here

+0

GL_APHA_TESTを有効にすると、残念ながら違いを確認していないようでした。次にステンシルテストを試してみるつもりです。 – jonbro

+0

また、glAlphaFuncで正しい設定を使用していることを確認する必要があります。 – whoplisp

+0

優秀!あなたが間違っていたglAlphaFuncでした。私はデフォルトを使っていましたが、gl.glAlphaFunc(GL.GL_GREATER、0.0)に設定しました。多かれ少なかれ期待通りに動作します... 2つの円の間の遷移領域にはノイズがありますが、私は描画コードを混乱させることができると思います...おそらく、アルファブレンディングしかし、いっぱいです。 – jonbro

0

私は本当にブレンドコードであなたを助けることはできませんが、私はあなたの描画ロジックを簡素化するかもしれない別の提案を持っています。

私はそのようなもののためにステンシルバッファを使いました。私はリニアグレーティングでテクスチャ加工されたディスクを描きたかったのです。重要な機能は格子の位相を正確に踏み込むことができるため、テクスチャ座標を気にしたくありませんでした。

大きな矩形でテクスチャを描き、その後ステンシルに白いディスクを描きました。

http://www.swiftless.com/tutorials/opengl/basic_reflection.html

(let ((cnt 0d0)) 
    (defmethod display ((w window)) 
    ;; the complex number z represents amplitude and direction 
    ;; of the grating constant 
    ;; r and psi addresses different points in the back focal plane 
    ;; r=0 will result in z=w0. the system is aligned to illuminate 
    ;; the center of the back focal plane for z=w0. 
    (let* ((w0 (* 540d0 (exp (complex 0d0 (/ pi 4d0))))) 
      (r 260d0) 
      (psi 270d0) 
      (w (* r (exp (complex 0d0 (* psi (/ pi 180d0)))))) 
      (z (+ w w0))) 
     (clear-stencil 0) 
     (clear :color-buffer-bit :stencil-buffer-bit) 
     (load-identity) 
     ;; http://www.swiftless.com/tutorials/ 
     ;; opengl/basic_reflection.html 
     ;; use stencil buffer to cut a disk out of the grating 
     (color-mask :false :false :false :false) 
     (depth-mask :false) 
     (enable :stencil-test) 
     (stencil-func :always 1 #xffffff) 
     (stencil-op :replace :replace :replace) 

     (draw-disk 100d0 (* .5d0 1920) (* .5d0 1080)) 
     ;; center on camera 549,365 
     ;; 400 pixels on lcos = 276 pixels on camera (with binning 2) 
     (color-mask :true :true :true :true) 
     (depth-mask :false) 
     (stencil-func :equal 1 #xffffff) 
     (stencil-op :keep :keep :keep) 

     ;; draw the grating 
     (disable :depth-test) 
     (with-pushed-matrix 
      (translate (* .5 1920) (* .5 1080) 0) 
     (rotate (* (phase z) 180d0 (/ pi)) 0 0 1) 
     (translate (* -.5 1920) (* -.5 1080) 0) 
     (draw *bild*)) 
     (disable :stencil-test) 
     (enable :depth-test) 

     (fill-grating *grating* (abs z)) 
     (format t "~a~%" cnt) 
     (if (< cnt 360d0) 
      (incf cnt 30d0) 
      (setf cnt 0d0)) 
     (update *bild*) 
     (swap-buffers) 
     (sleep (/ 1d0)) ;; 1 frame per second 
     (post-redisplay))))