Подкрасьте растровое изображение с помощью libgdx
Я разместил вопрос о рисовании текста на растровом изображении для создания динамических текстур во время выполнения, и эта проблема была решена здесь
Есть ли простой способ, которым я могу подкрасить шрифт, который я копирую в новое растровое изображение, или мне нужно сделать это вручную попиксельно? Я не могу найти ничего очевидного в библиотеке libgdx или в Google.
Мой текущий процесс:
- создать новое растровое изображение
- нарисовать символ на этом растровом изображении
- преобразовать растровое изображение в текстуру для рендеринга.
В какой-то момент в этом процессе я хотел бы подкрасить шрифт во время выполнения.
Код обновлен, чтобы проверить ответ 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).
- Возьмите текстуру из буфера кадров и используйте ее в качестве окрашенного шрифта.