Masking image that contains alpha makes the inner mask black

I'm trying to mask a background image that is smaller than the mask. and the space between the background and mask appears black.

This is the code I'm using:

     batch.end();
     batch.begin();     
     Gdx.gl20.glColorMask(false, false, false, true);
     batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ZERO);
     batch.draw(mask, getX(), getY());
     batch.flush();
     Gdx.gl20.glColorMask(true, true, true, true);      
     batch.setBlendFunction(GL20.GL_DST_ALPHA, GL20.GL_ONE_MINUS_DST_ALPHA);        
     batch.draw(texture, getX(), getY());       
     batch.flush();
     batch.setBlendFunction(GL20.GL_SRC_ALPHA,GL20.GL_ONE_MINUS_SRC_ALPHA);
     batch.end();
     batch.begin();

I tried all kind function combinations without any success. probably i'm missing something.

Update

Attaching chart that I build of all possible (relevant) results of src and dst blending function. Fortunately none of the below is working, and as I guessed there is something more need to be done in order to achieve the result.

     Gdx.gl20.glColorMask(true, true, true, true);      
     batch.setBlendFunction(src_func, dst_func);        
     batch.draw(texture, getX(), getY());       

在这里输入图像描述


使用FrameBuffer解决它。

    batch.end();
    spriteBatch.begin();
        buffer.begin();
            Gdx.gl20.glColorMask(false, false, false, true);
            spriteBatch.setBlendFunction(GL20.GL_ONE, GL20.GL_ZERO);
            spriteBatch.draw(mask, 0,0);
            Gdx.gl20.glColorMask(true, true, true, true);
            spriteBatch.setBlendFunction(GL20.GL_DST_ALPHA, GL20.GL_ZERO);
            spriteBatch.draw(texture, 0,0);
            spriteBatch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        buffer.end();
    spriteBatch.end();      
    batch.begin();
    batch.draw(buffer.getColorBufferTexture(), getX(), getY());

Just taking a look at your images, it looks like:

  • The alpha of the mask is in complete control of the output alpha
  • You want the alpha of the background image to also be taken into account
  • In other words, you only want alpha where both images have alpha.


    I haven't yet been able to look into more of the blending functions and how they work, and may update with further details on how to achieve your goals as I figure it out, but maybe knowing what you are trying to accomplish will help you figure it out before I get to it.

    How to do blending in LibGDX - this question seems interesting, combining the source and destination images in a grid to show the effects.

    链接地址: http://www.djcxy.com/p/30310.html

    上一篇: 在三星Galaxy设备上同时访问前后相机

    下一篇: 包含alpha的蒙版图像会使内蒙版变黑