gpt4 book ai didi

java - 带有图像的 Libgdx 掩码

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:17 25 4
gpt4 key购买 nike

我有一个帧缓冲区,其中一些形状是使用 ShapeRenderer 绘制的。现在我想用图像中的蒙版来掩盖这个帧缓冲区。在此之前,我使用 ShapeRenderer 绘制的简单圆形蒙版进行了处理。但是我需要使用更复杂的蒙版,所以我必须使用图像。面具是一个带有黑色面具和透明背景的 png。这是我的代码:

   @Override
public void draw(Batch batch, float parentAlpha) {

//disable RGB color, only enable ALPHA to the frame buffer
Gdx.gl.glColorMask(false, false, false, true);

//change the blending function for our alpha map
batch.setBlendFunction(GL20.GL_ZERO, GL20.GL_SRC_ALPHA);

//draw alpha mask sprite(s)
batch.draw(maskTexture, MASK_OFFSET_X + getX(), MASK_OFFSET_Y + getY());

//flush the batch to the GPU
batch.flush();

Gdx.gl.glColorMask(true, true, true, true);
batch.setBlendFunction(GL20.GL_DST_ALPHA, GL20.GL_ONE_MINUS_DST_ALPHA);

//The scissor test is optional, but it depends
Gdx.gl.glEnable(GL20.GL_SCISSOR_TEST);
Gdx.gl.glScissor(MASK_OFFSET_X + (int) getX(), MASK_OFFSET_Y + (int) getY(), maskTexture.getWidth(), maskTexture.getHeight());

//draw framebuffer to be masked
batch.draw(frm, getX(), getY(), frmSizeX, frmSizeY);

//remember to flush before changing GL states again
batch.flush();

//disable scissor before continuing
Gdx.gl.glDisable(GL20.GL_SCISSOR_TEST);

//set default blend function
batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
}

我的图像确实被蒙版了,但是蒙版图像有黑色背景(它应该是透明的)。现在看起来像这样:

enter image description here

它应该看起来像这样的例子(除了这个例子没有 mask 所以ofc油漆不应该在头外):

enter image description here

另请注意,油漆是半透明的。 (不知道会不会改一些代码)。

Ofc 我使用的是 RGBA8888 格式,这里是初始化代码:

frmBuff = new FrameBuffer(Format.RGBA8888, frmSizeX, frmSizeY, false);
frm = new TextureRegion(frmBuff.getColorBufferTexture());
frmCam = new OrthographicCamera(frmSizeX, frmSizeY);
frmCam.translate(frmSizeX / 2, frmSizeY / 2);

maskTexture = game.manager.get("my_mask.png", Texture.class);
maskTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

我搞乱了 setBlendFunction 并获得了非常不同的结果,但实际上没有一个是正确的。

我该如何解决这个问题?

顺便说一句,我的代码基于这个例子: https://gist.github.com/mattdesl/6076846

我也已经读过这个: https://github.com/mattdesl/lwjgl-basics/wiki/LibGDX-Masking

最佳答案

我知道这是一个旧帖子。但我对这个问题的所有研究都只把我带到这里。我阅读了关于 https://gist.github.com/mattdesl/6076846 的帖子并意识到问题在于您只考虑了 mask 的 alpha,但实际上您想要 mask 与前景(紫色颜料)的乘积的 alpha。

//disable RGB color, only enable ALPHA to the frame buffer
Gdx.gl.glColorMask(false, false, false, true);

//change the blending function for our alpha map
batch.setBlendFunction(GL20.GL_ZERO, GL20.GL_SRC_ALPHA);

//draw alpha mask sprite(s)
batch.draw(maskTexture, MASK_OFFSET_X + getX(), MASK_OFFSET_Y + getY());

//change the function for our source
batch.setBlendFunction(GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_SRC_ALPHA);

//draw the source alpha
river_sprite.draw(batch);

//flush the batch to the GPU
batch.flush();

关于java - 带有图像的 Libgdx 掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33037564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com