1

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

有没有一种简单的方法可以为复制到新像素图的字体着色,还是需要逐个像素地手动进行着色?我在 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();

例子

4

1 回答 1

2

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

  • 获取字体的像素图(在您的情况下为 fontPixmap)
  • 确保启用了 Alpha 混合。
  • 设置颜色,(将 alpha 设置为所需的级别)
  • 在整个字体图像上绘制矩形(0,0,宽度,高度)
  • 现在字体的像素图具有所需的着色

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

编辑:

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

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

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

编辑2:

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

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