Подкрасьте растровое изображение с помощью libgdx

Я разместил вопрос о рисовании текста на растровом изображении для создания динамических текстур во время выполнения, и эта проблема была решена здесь

Есть ли простой способ, которым я могу подкрасить шрифт, который я копирую в новое растровое изображение, или мне нужно сделать это вручную попиксельно? Я не могу найти ничего очевидного в библиотеке 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();

пример

1 ответ

Pixmap имеет все функции, которые вам нужны, чтобы подкрасить его.

  • Получить растровое изображение шрифта (в вашем случае fontPixmap)
  • Убедитесь, что альфа-смешивание включено.
  • Установите цвет(установка альфа на желаемый уровень)
  • Нарисуйте прямоугольник по всему изображению шрифта (0,0, ширина, высота)
  • Теперь растровое изображение вашего шрифта имеет желаемую тонировку

Надеюсь, это прояснит для вас.

Редактировать:

Хорошо, так что я понимаю, что именно вы имеете в виду, похоже, по умолчанию нет способа изменить "тип" наложения для Pixmap. По крайней мере, без меня, глядя на родной код под крышками. BitmapFont обходит это, используя данные вершин для глифа, и отображает каждый из них в виде фигуры, а не изображения. Таким образом, чтобы сделать это, вам нужно сделать это за два прохода:

  • Сначала мы заполняем растровое изображение требуемым цветом и альфа-каналом (обратите внимание: значения для этого значения находятся в диапазоне от 0f до 1f, поэтому ваша альфа должна быть что-то вроде 0.3f, а не 100)
  • Затем вы перебираете все пиксели изображения и ищете пиксели, у которых альфа-значение ниже определенного порога (должно быть около 0,3f). Затем вы можете либо установить альфа этих пикселей ниже порогового значения на 0, либо, возможно, сделать что-нибудь более изворотливое, например, Math.pow(альфа, 3) и т. Д. В основном, альфа, которую вы только что добавили к изображению (используя источник поверх смешивания), вы хотите уменьшить / удалить, но только для пикселей, которые должны быть прозрачными. Возможно, вам придется поиграть с различными значениями или методами сокращения, чтобы это выглядело правильно.

Примечание. Вы можете перебирать данные пикселов, вызывая getPixel() или получать Bytebuffer с getPixels(), и 4-й байт будет альфа-значением пикселя в диапазоне от 0 до 255.

Изменить 2:

Я просто подумал, что альтернативный способ сделать это - использовать Frame Buffer.

  • Визуализируйте текстуру вашего шрифта в буфер кадра.
  • Нарисуйте цветной прямоугольник с альфа-каналом по всему фрейму буфера, используя правильную функцию альфа-смешивания (Не знаю, какая из них у меня на макушке, но вам нужен тот, который применяется только в том случае, если dst имеет альфа больше 0).
  • Возьмите текстуру из буфера кадров и используйте ее в качестве окрашенного шрифта.
Другие вопросы по тегам