STB рендеринг шрифтов просто отображает черный ящик поверх текстур - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь отобразить шрифт из файла 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().

Многое не смог сделать, но после более мобильных исследований я все еще рисую пробел.

...