2

我想在foreground纹理上叠加background纹理。除了这两个纹理,我还有一个mask指示前景的哪些部分应该是透明的。这是我尝试过的:

// Initially, the mask should have an alpha of 1
Pixmap mask = new Pixmap(128, 128, Pixmap.Format.Alpha);

// Cut a rectangle of alpha value 0
mask.setColor(new Color(0f, 0f, 0f, 0f));
mask.fillRectangle(0, 0, 32, 32);

// Load the foreground. The foreground should the same alpha values
// as the mask. If the mask has an alpha value of 1, then the foreground is
// visible. If the mask is 0, then the foreground is invisible.
Pixmap fg = new Pixmap(Gdx.files.internal("foreground.png"));
fg.drawPixmap(mask, fg.getWidth(), fg.getHeight());
Texture foreground = new Texture(fg);

Texture background = new Texture("background.png");

不用说,结果不是我想要的。我应该更改什么,以便在蒙版的 alpha 值为 0 的地方可见背景,而在蒙版的 alpha 值为 1 的地方可见前景。

4

1 回答 1

8

我认为这里的问题是混合。Pixmap.setBlending()默认设置为SourceOver。这意味着绘制一个 alpha 0 的矩形根本不会导致任何变化,因为您绘制的是一个不可见的矩形。尝试将其设置Pixmap.Blending.None为真正切出矩形。

// Initially, the mask should have an alpha of 1
Pixmap mask = new Pixmap(128, 128, Pixmap.Format.Alpha);

// Cut a rectangle of alpha value 0
mask.setBlending(Pixmap.Blending.None);
mask.setColor(new Color(0f, 0f, 0f, 0f));
mask.fillRectangle(0, 0, 32, 32);

Pixmap fg = new Pixmap(Gdx.files.internal("foreground.png"));
fg.drawPixmap(mask, fg.getWidth(), fg.getHeight());
mask.setBlending(Pixmap.Blending.SourceOver);

Texture foreground = new Texture(fg);
Texture background = new Texture("background.png");

实际上,您甚至不需要创建蒙版,但您可以直接“剪切”前景像素图上的矩形。

于 2013-12-09T13:37:29.973 回答