2012-03-23 20 views
0

2つのビットマップをマージして、結果のビットマップをマスクとして使用する必要があります。以前に描かれたシステムに影響を与えずにOpenGL-1.0でこれを行う方法はありますか?ここでOpenGLES:2つのマスク(ビットマップ)をマージする

私のアルゴリズムです:

1.-は、(不透明な)背景を描く 2.-マスクを描く(これは2つのビットマップの組み合わせである) 3.-は、なるように(このニーズビットマップを描きますマスクされた)。

私はOpenGLES 1.0で作業していますので、シェーダは動作しません。どんな助けでも大歓迎です!ここで

は私の描画機能である:

public void onDrawFrame(GL10 gl) { 

    // clear the screen and depth buffer 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    // drawing 
    gl.glLoadIdentity(); 

    // draw the background 
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); 
    gl.glTranslatef(0.0f, 0.0f, -3.72f); 
    background.draw(gl); 
    gl.glPopMatrix(); 

    gl.glPushMatrix(); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 

    // mask1 + mask2 
    gl.glLoadIdentity(); 
    gl.glTranslatef(0.0f, 0.0f, -3.72f); 
    gl.glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ZERO); 
    mask1.draw(gl); 

    gl.glLoadIdentity(); 
    gl.glTranslatef(0.0f, y, -3.72f); 
    gl.glBlendFunc(GL10.GL_DST_COLOR, GL10.GL_ZERO); 
    mask2.draw(gl); 

    gl.glLoadIdentity(); 
    gl.glTranslatef(0.0f, 0.0f, -3.72f); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); 
    picture.draw(gl); 

    gl.glDisable(GL10.GL_BLEND); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glFlush(); 
    gl.glPopMatrix(); 

    y -= 0.2f; 

    } 
+0

擬似コード私のような何かを行くだろうと考えていますか? 'mask1'と' mask2'は 'picture'のテクスチャとして使用できますか? –

+0

はい。どちらもテクスチャとして使用できます。物事は、1つは固定された位置にあり、もう1つは移動したり回転したりします。結果として、私は両方のマスクの構成だけを表示したいと思います(それらの間に何らかのANDがあります)。 – ilbesculpi

+0

'Background'は画面全体に渡ります。 '写真'はどうですか?これも完全な画面に広がっていますか?マスクは確かにいくぶん小さくなっています。 –

答えて

4

あなたは、このためにステンシルバッファのようなもので見たことがありますか?この答えは実際にはビットマップをマージしませんが、探している結果があればその組み合わせをマスクとして使用します。マスクの論理ORまたは論理ANDのどちらかを使用することができます(必要なものは不明)。マスクは、いくつかの画面整列クワッドある

glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

draw_background(); 

glEnable(GL_STENCIL_TEST); //enable stencil buffer 
glStencilFunc(GL_ALWAYS, 0 , 0); //always pass stencil test 
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); //increment buffer on fragment draw 

draw_mask1(); 
draw_mask2(); 

if(OR masks) 
    glStencilFunc(GL_LEQUAL, 1, 0xffffffff); //OR masks: pass fragment if (1 <= buffer) 
else if (AND masks) 
    glStencilFunc(GL_LEQUAL, 2, 0xffffffff); //AND masks: pass fragment if (2 <= buffer) 

glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP); //don't change buffer 

draw_bitmap_to_be_masked();