Я пытаюсь отобразить шрифт из файла ttf в Java с использованием STB, но я столкнулся с проблемой при отображении.Я думаю, что проблема в том, что запеченные данные шрифта находятся в каком-то формате, и я не использую их правильно, но смотрю на эту демонстрацию с использованием LWJGL3, но с более старой версией OpenGL.Глядя на код, который я вижу, это называется сначала
glBindTexture(GL_TEXTURE_2D, texID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, BITMAP_W, BITMAP_H, 0,
GL_ALPHA, GL_UNSIGNED_BYTE, bitmap);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glClearColor(43f / 255f, 43f / 255f, 43f / 255f, 0f); // BG color
glColor3f(169f / 255f, 183f / 255f, 198f / 255f); // Text color
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Так что в моем коде я связываю текстуру, а потом вместо этого:
glTexCoord2f(q.s0(), q.t0());
glVertex2f(x0, y0);
glTexCoord2f(q.s1(), q.t0());
glVertex2f(x1, y0);
glTexCoord2f(q.s1(), q.t1());
glVertex2f(x1, y1);
glTexCoord2f(q.s0(), q.t1());
glVertex2f(x0, y1);
Я добавляю данные в FloatBuffer какthis:
if (vertices.remaining() < 7 * 6) {
/* We need more space in the buffer, so flush it */
flush();
}
float r = c.getRed();
float g = c.getGreen();
float b = c.getBlue();
float a = c.getAlpha();
vertices.put(x1).put(y1).put(r).put(g).put(b).put(a).put(s1).put(t1);
vertices.put(x1).put(y2).put(r).put(g).put(b).put(a).put(s1).put(t2);
vertices.put(x2).put(y2).put(r).put(g).put(b).put(a).put(s2).put(t2);
vertices.put(x1).put(y1).put(r).put(g).put(b).put(a).put(s1).put(t1);
vertices.put(x2).put(y2).put(r).put(g).put(b).put(a).put(s2).put(t2);
vertices.put(x2).put(y1).put(r).put(g).put(b).put(a).put(s2).put(t1);
numVertices += 6;
Затем сбросьте его:
if (numVertices > 0) {
vertices.flip();
if (vao != null) {
vao.bind();
} else {
vbo.bind(GL_ARRAY_BUFFER);
specifyVertexAttributes();
}
program.use();
/* Upload the new vertex data */
vbo.bind(GL_ARRAY_BUFFER);
vbo.uploadSubData(GL_ARRAY_BUFFER, 0, vertices);
/* Draw batch */
glDrawArrays(GL_TRIANGLES, 0, numVertices);
/* Clear vertex data for next batch */
vertices.clear();
numVertices = 0;
}
Я получаю ByteBuffer здесь:
STBTTBakedChar.Buffer cdata = STBTTBakedChar.malloc(96);
ByteBuffer bitmap = BufferUtils.createByteBuffer(BITMAP_W*BITMAP_H);
stbtt_BakeFontBitmap(ttf, font.getSize()*Window.getContentScaleY(), bitmap,
BITMAP_W, BITMAP_H, 32, cdata);
И каждый глиф отображается здесь:
try (MemoryStack stack = stackPush()) {
IntBuffer pCodePoint = stack.mallocInt(1);
FloatBuffer x = stack.floats(0.0f);
FloatBuffer y = stack.floats(0.0f);
STBTTAlignedQuad q = STBTTAlignedQuad.mallocStack(stack);
float factorX = 1.0f/Window.getContentScaleX();
float factorY = 1.0f/Window.getContentScaleY();
float lineY = 0.0f;
for (int i = 0, to = text.length(); i < to; ) {
int cp = pCodePoint.get(0);
if (cp == '\n') {
y.put(0, lineY = y.get(0)+(ascent-
descent+lineGap)*font.getSize());
x.put(0, 0.0f);
i += getCP(text, to, i, pCodePoint);
continue;
} else if (cp < 32 || 128 <= cp) {
i += getCP(text, to, i, pCodePoint);
continue;
}
float cpX = x.get(0);
stbtt_GetBakedQuad(cdata, BITMAP_W, BITMAP_H, cp-32, x, y, q,
true);
x.put(0, scale(cpX, x.get(0), factorX));
getCP(text, to, i, pCodePoint);
x.put(0, x.get(0)+stbtt_GetCodepointKernAdvance(info, cp,
pCodePoint.get(0))*font.getSize());
float
x0 = scale(cpX, q.x0(), factorX),
x1 = scale(cpX, q.x1(), factorX),
y0 = scale(lineY, q.y0(), factorY),
y1 = scale(lineY, q.y1(), factorY);
font.genMipmaps();
drawTextureRegion(x0, y0, x1, y1, q.s0(), q.s1(), q.t0(),
q.t1(), font.getC());
i += getCP(text, to, i, pCodePoint);
}
}
(getCP предназначен только для стековых персонажей, он всегда будет возвращать 1 для моей цели) Теперь без рендеринга шрифта я просто вижу текстуру одного игрока, которая должна рисовать, в цвете и всем прочем.Когда я отрисовываю шрифт.большая черная коробка покрывает область игрока, и текст не отображается.
Я попытался выполнить мипмапинг с текстурой, но это не сработало.Я удостоверился, что вызвал glEnableVertexAttribArray ().Итак, почему там черный ящик, и почему текст не отображается?(Я сделал изображение в правом верхнем углу и текст в левом нижнем углу)
Вот GitHub со всем проектом
Двойная проверка ByteBuffer Я почти уверенчто значения находятся в правильном порядке.
Добавлены glTexImage2D и glTexParameteri, но все еще ничего.
При просмотре вопросов единственными ответами, которые я видел, являются mipmapping (который я пробовал) и вызов glEnableVertexAttribArray().
Многое не смог сделать, но после более мобильных исследований я все еще рисую пробел.