【问题标题】:How to get and set pixels in textures (LibGDX)如何获取和设置纹理中的像素(LibGDX)
【发布时间】:2015-11-16 20:49:22
【问题描述】:

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

【问题讨论】:

  • 使用着色器为纹理颜色着色。如果将纹理设为灰度,则将纹理值乘以颜色(例如,(1,0,0,1) 表示红色)将为它着色。
  • @ColonelThirtyTwo 这样做的问题是我不希望整个图像被重新着色,只需要其中的某些颜色 - 例如将所有橙色更改为蓝色。
  • 然后使用多个纹理;一个用于可着色部分,一个用于保持不变的部分,然后在着色器中将它们混合在一起。
  • 好的,那我试试! :)

标签: java opengl libgdx textures pixel


【解决方案1】:

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

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

可能有一些方法可以优化它,因为它会非常昂贵,甚至 LibGDX API 都指出了某个地方(但暂时找不到它) - 我想不到您可能可以同时绘制相同颜色的大方块。如果你有一个很好的算法来找到正方形。

检查 PixMap 的 API 以使用它。你可以通过Texture newTex = new Texture(PixMap);获得新的纹理


然而

正如@ColonelThirtyTwo 在他的评论中所建议的那样,混合图像很有可能会节省大量的处理时间。以灰度创建原始图像然后混合图像要容易得多。如果整个图像将具有不同的团队颜色深浅,这将特别有效。

但是,假设您希望除建筑物上的旗帜之外的所有东西都使用特定颜色。您可以将标志制作为单独的图像,并将该图像的颜色与整个图像的颜色相同,与@Xoppa's answer 建议的方式相同。 (因为我看到他的回答和我写的一样;))如果是我,这就是我会采取的方法。

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

我本人会将整个图像与颜色混合,或者如果您不希望整个图像与颜色相乘,则将图像分成两个图像,然后只混合应该混合的一个。

【讨论】:

  • 我会试试 PixMap 的想法。它不应该太慢,因为我只会在每次建造新城堡时更改颜色(不经常)。你知道从纹理创建像素图的方法吗?
  • @ZacG 仅来自我在第一段中提供的链接中阅读的内容。主线似乎是Pixmap pixmap = texture.getTextureData().consumePixmap(); - 我自己不需要这样做,所以不确定它的效果如何,或者在使用它时是否需要注意任何条件。
  • @ZacG 如果您将来发现低帧率,您应该尝试的第一件事是使用通用纹理而不是团队颜色的纹理,看看它是否有所作为。
【解决方案2】:

您可以读取纹理数据(包括将其从 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,但这与您的问题无关。

【讨论】:

  • 我试试看 - 似乎它应该可以工作。 :)
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
相关资源
最近更新 更多