поэтому я пытаюсь добавить TrueTypeFonts в свою игру. И в основном, у меня есть, чтобы прочитать TrueTypeFont из файла, и он правильно читает его в BufferedImage. Но когда я передаю BufferedImage в свой конструктор Sprite
(для загрузки изображений, которые будут использоваться с OpenGL), он полностью разрывает его. Посмотрите на следующие изображения:
Итак, вот конструктор для моего класса утилиты Sprite, который возьмет BufferedImage и преобразует его в ByteBuffer и привяжет его к ID.
public Sprite(BufferedImage img) {
// this will show the BufferedIamge in a modal dialog, see Fig. 2
JOptionPane.showMessageDialog(null, null, "Another", JOptionPane.YES_NO_OPTION, new ImageIcon(img.getScaledInstance(img.getWidth() * 4, img.getHeight() * 4, Image.SCALE_REPLICATE)));
int[] pixels = new int[img.getWidth() * img.getHeight()];
img.getRGB(0, 0, img.getWidth(), img.getHeight(), pixels, 0, img.getWidth());
this.width = img.getWidth();
this.height = img.getHeight();
ByteBuffer buff = BufferUtils.createByteBuffer(img.getWidth() * img.getHeight() * 4);
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
int pixel = pixels[y * img.getWidth() + x];
buff.put((byte) ((pixel >> 16) & 0xFF));
buff.put((byte) ((pixel >> 8) & 0xFF));
buff.put((byte) (pixel & 0xFF));
buff.put((byte) ((pixel >> 24) & 0xFF));
}
}
buff.flip();
id = GL.glGenTextures();
GL.glEnable(GL_TEXTURE_2D);
GL.glBindTexture(GL_TEXTURE_2D, id);
GL.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1);
GL.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1);
GL.glTexImage2D(GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL_RGBA, GL.GL_UNSIGNED_BYTE, buff);
}
Рисунок 2 - Изображение, которое мы проходим, выглядит хорошо! Рисунок 3 - Когда я делаю изображение, заметьте, что я могу отобразить любое другое изображение, и все получится нормально. Даже прозрачные тоже. Игнорируйте blob внизу, чтобы я попытался отобразить строку текста! Любая помощь очень ценится, я потратил некоторое время, пытаясь понять, как реализовать шрифты.
Без фактического запуска тестового проекта я бы заподозрил, что причина в том, что он выглядит так: следующий код:
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
заставляет пиксели добавлять, сканируя сначала, а не наоборот. Чтобы перейти, переверните циклы for:
for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {