用libgdx修改pixmap

时间:2014-02-20 22:20:43

标签: java libgdx pixmap

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

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

我目前的流程是:

  1. 创建一个新的pixmap
  2. 在该pixmap上绘制一个角色
  3. 将像素图转换为用于渲染的纹理。
  4. 在该过程中的某个时刻,我希望能够在运行时对字体进行着色。

    更新了代码以测试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();
    

    example

1 个答案:

答案 0 :(得分:2)

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

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

希望能为你清除它。

修改:

好吧,所以我明白你究竟是什么意思,看来默认情况下没有办法改变Pixmap的混合'类型'。至少没有我查看封面下的本机代码。 BitmapFont通过使用字形的顶点数据来解决这个问题,并将每个数据渲染为形状而不是图像。所以为了做到这一点,你必须通过两次通过:

  • 首先我们用所需的颜色和alpha填充像素图(注意:这个值在0f和1f之间,所以你的alpha应该是0.3f而不是100)
  • 接下来,您迭代图像的所有像素,并查找其alpha值低于特定阈值的像素(应该在0.3f左右)。然后你可以将低于阈值的那些像素的alpha设置为0,或者做一些像Math.pow(alpha,3)等更漂亮的东西。基本上你刚刚添加到图像中的alpha(使用源代码混合)你想要的减少/删除,但仅适用于应该是透明的像素。您可能需要使用不同的值或缩减技术才能使其正确显示。

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

编辑2:

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

  • 将字体纹理渲染到帧缓冲区。
  • 使用正确的Alpha混合功能在整个帧缓冲区上绘制一个带有alpha的彩色矩形(不确定哪一个在我的头顶,但你想要一个仅在dst的alpha大于0的情况下才适用)。
  • 从帧缓冲区中抓取纹理并将其用作有色字体。