2012-03-23 45 views
0

我需要合併兩個位圖以使用生成的位圖作爲蒙版。有沒有辦法在OpenGL-1.0中做到這一點,而不會影響以前繪製的系統。OpenGLES:合併兩個蒙版(位圖)

這裏是我的算法:

1.-繪製背景(不透明) 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'的紋理嗎? – 2012-03-26 16:37:58

+0

是的。兩者都可以用作紋理。事情是,一個將處於固定位置,另一個將移動和/或旋轉。因此,我希望只顯示兩個蒙版的組成(它們之間有某種AND)。 – ilbesculpi 2012-03-26 19:55:12

+0

背景橫跨整個屏幕。 「圖片」呢?這是否也跨越了整個屏幕?面具肯定有點小。 – 2012-03-27 05:36:31

回答

4

你看着像這個模板緩存?這個答案實際上並沒有合併位圖,但是如果這是你想要的結果,它會將它們的組合用作掩碼。你可以使用掩碼的邏輯或或邏輯與(不知道你想要什麼)。

僞代碼,我相信會去是這樣的:

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();