如何在纹理中获取和设置像素(LibGDX)

时间:2015-11-16 20:49:23

标签: java opengl libgdx textures pixel

我正在制作一个游戏,我有2个以上的团队,并且 - 因为我不想画出所有可能的彩色建筑 - 我正在寻找一种方法来将纹理中的某种颜色替换为团队的颜色。有没有办法在LibGDX中设置和像素颜色,所以我可以这样做?顺便说一句,我的纹理是纹理,而不是TextureRegion或其他任何东西。

2 个答案:

答案 0 :(得分:0)

您可以读取纹理数据(包括将其从VRAM复制到RAM并返回)或在上传到GPU(直接修改Pixmap)之前修改它。但你可能不必那样做。相反,你可以使用着色作为上校三十二提到的那样做。幸运的是SpriteBatch内置了这个功能。您可以使用batch.setColor方法。如果您使用的是scene2d,则可以使用actor.setColor。

batch.setColor(Color.RED); // Everything after this will be tinted (multiplied with) red
batch.draw(texture, x, y);
batch.setColor(Color.WHITE); // set it back to white for the remaining draw calls

如果您只需要更改部分图像的颜色。然后将图像分成两部分。为此,顺便说一句,我强烈建议使用TextureAtlas,但这与你的问题无关。

答案 1 :(得分:0)

您可以从纹理illustrated in this other question获取像素数据。

然后,您可以创建一个新的PixMap,并从原始PixMap逐个像素地绘制它 - 用您的团队颜色替换任何指定的颜色。

可能有很多方法可以优化它,因为它会非常昂贵,甚至LibGDX API指出某处(但无法找到它,随意) - 在我的头顶你可以同时绘制相同颜色的大方块。如果你有一个很好的算法来找到正方形。

检查PixMap的API以便使用它。您可以通过执行Texture newTex = new Texture(PixMap);

来获取新纹理

然而

正如@ColonelThirtyTwo在评论中建议的那样,混合图像可以节省大量的处理时间。以灰度创建原始图像然后混合图像要容易得多。如果整个图像将改变团队颜色的阴影,这将特别有效。

但是,假设您想要除建筑物上的旗帜外的所有物品的特定颜色。你可以使标志成为一个单独的图像,只是将一个图像的颜色与整个图像的颜色相同,就像@Xoppa's answer建议的那样。 (因为我看到他的回答和我写的一样;))如果是我的话,那就是我会采取的方法。

否则,您将创建两个图像。原始图像和您的蒙版(指定将应用团队颜色像素的位置)。您将蒙版与所需颜色相乘,然后将蒙版应用于原始图像,原始图像在应用蒙版的像素上具有灰度值。

我,我自己,要么将整个图像与颜色混合,要么如果你不希望整个图像乘以颜色,将图像分成两个图像,然后混合应该混合的图像。