【问题标题】:Tint a pixmap in with libgdx使用 libgdx 为像素图着色
【发布时间】:2014-02-22 02:22:25
【问题描述】:

我发布了一个关于在像素图上绘制文本以在运行时生成动态纹理的问题,该问题已解决here

有没有一种简单的方法可以为复制到新像素图的字体着色,还是需要逐个像素地手动进行着色?我在 libgdx 库或 Google 上找不到任何明显的东西。

我目前的流程是:

  1. 创建一个新的像素图
  2. 在该像素图上绘制一个字符
  3. 将像素图转换为纹理进行渲染。

在该过程中的某个时刻,我希望能够在运行时为字体着色。

更新代码以测试 Jyro117 的答案。 (不工作,见下图)

    // Set up the base image
    Pixmap newPixmap = new Pixmap(backImage.getWidth(),
            backImage.getHeight(), Format.RGBA8888);
    newPixmap.drawPixmap(backImage, 0, 0);

    // Copy out the letter from our fontsheet
    // and draw the char to a new pixmap
    Glyph glyph = fontData.getGlyph(getLetterToDraw().charAt(0));
    Pixmap charPixmap = new Pixmap(glyph.width, glyph.height,
            Format.RGBA8888);
    charPixmap.drawPixmap(fontPixmap, 0, 0, glyph.srcX, glyph.srcY,
            glyph.width, glyph.height);

    // try to tint it?!
    charPixmap.setColor(1, 0, 0, 100);
    charPixmap.fillRectangle(0, 0, newPixmap.getWidth(),
            newPixmap.getHeight());

    // copy the character to our new bitmap
    newPixmap.drawPixmap(charPixmap, (BLOCK_SIZE - glyph.width) / 2,
            (BLOCK_SIZE - glyph.height) / 2);

    texture = new Texture(newPixmap);

    newPixmap.dispose();
    charPixmap.dispose();

【问题讨论】:

  • 可能会在Badlogicforum问整个流程的问题。在运行时从 Bitmapfont 到 pixermap... 像素图的 alpha 似乎有问题。它应该与叠加层一起使用,但 alpha 混合不正确。也许它不可能是你想要的。没有其他方法可以为像素图着色。否则,您需要在创建像素图之前为字体着色,但我认为不可能这样。
  • 您可以使用 2 种字体:一种使用默认颜色,一种使用着色颜色并在它们之间切换。还是我误会了什么?
  • @Springrbua 是的,这是一个选项,面包然后我需要为我想要使用的每种颜色创建并存储一张表。
  • 不能只给字体上色吗? BitMapFont.setColor(Color)?
  • 我没有使用 BitmapFont 对象进行绘图,否则可以。

标签: java libgdx pixmap


【解决方案1】:

Pixmap 具有着色所需的所有功能。

  • 获取字体的像素图(在您的情况下为 fontPixmap)
  • 确保启用 Alpha 混合。
  • 设置color,(将alpha设置为所需的级别)
  • Draw rectangle 覆盖整个字体图像(0,0,width,height)
  • 现在字体的像素图具有所需的着色

希望这可以为您解决问题。

编辑:

好的,我明白你的意思了,默认情况下似乎无法更改 Pixmap 混合的“类型”。至少没有我在幕后研究本机代码。 BitmapFont 通过使用字形的顶点数据来解决这个问题,并将每个数据渲染为形状而不是图像。所以为了做到这一点,你必须通过两次:

  • 首先,我们用所需的颜色和 alpha 填充像素图(注意:此值介于 0f 和 1f 之间,因此您的 alpha 应该是 0.3f 而不是 100)
  • 接下来,您将遍历图像的所有像素,并寻找其 alpha 值低于某个阈值(应为 0.3f 左右)的像素。然后你可以将低于阈值的像素的 alpha 设置为 0,或者做一些更高级的事情,比如 Math.pow(alpha, 3) 等。基本上你刚刚添加到图像中的 alpha(使用源过度混合)你想要减少/删除,但仅适用于应该是透明的像素。您可能需要尝试不同的值或缩减技术才能使其看起来正确。

注意:您可以通过调用getPixel() 来迭代像素数据或使用getPixels() 获取字节缓冲区,第4 个字节将是像素的alpha 值,介于0 和255 之间。

编辑 2:

我只是想到了另一种方法是使用Frame Buffer

  • 将字体纹理渲染到帧缓冲区。
  • 使用适当的 alpha 混合功能在整个帧缓冲区上绘制一个带有 alpha 的彩色矩形(我不确定哪个是我的头顶,但您想要一个仅在 dst 的 alpha 大于 0 时适用的矩形)。李>
  • 从帧缓冲区中获取纹理并将其用作着色字体。

【讨论】:

  • 我昨天尝试按照这些方法工作,但只能为整个矩形着色。即 100% alpha 的区域现在被着色了。我已经用你的建议更新了我的问题代码。我在这里做错了什么?
  • 嘿,我更新了我的答案,希望能帮助你弄清楚。
  • 感谢您的更新...我想我可能不得不走 getPixels 路线。一旦我整理好答案,我会播放并发布答案。
  • 我添加了一点关于使用帧缓冲区而不是像素图来让混合真正正常工作的内容。
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2013-10-04
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多