Как улучшить производительность рендеринга текстур OpenGL - PullRequest
0 голосов
/ 30 марта 2019

Я использую OpenGL для рендеринга текста в моем приложении, в моей реализации глиф - это небольшая текстура, рендеринг работает правильно, но производительность слишком низкая. Ниже приведен фрагмент кода, когда макет содержит 8000 глифов, для завершения рендеринга потребовалось около 200 мс (функция рендеринга), я думаю, что цикл for является ключом для замедления процесса рендеринга, возможно, для рендеринга каждого отдельного глифа как текстура - это «дурацкий путь» :(, есть ли способ улучшить производительность рендеринга текста?

#define FONT_BITMAP_WIDTH 128
#define FONT_BITMAP_HEIGHT 128

void setupOpenGL() {
    ...
    ...
    // create pixel buffer object to render texture
    glGenBuffers(1, &_pixelBuffer);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _pixelBuffer);
    glBufferData(GL_PIXEL_UNPACK_BUFFER, 
                 FONT_BITMAP_WIDTH * FONT_BITMAP_HEIGHT, 
                 NULL, 
                 GL_STREAM_DRAW);
    ...
    ...
    // create texture
    glTexImage2D(GL_TEXTURE_2D,
                 0,
                 GL_RED,
                 FONT_BITMAP_WIDTH,
                 FONT_BITMAP_HEIGHT,
                 0,
                 GL_RED,
                 GL_UNSIGNED_BYTE,
                 NULL);
    ...
    ...
}

void render(Glyph** glyphs, int count) {

    // render every single glyph
    for (int i = 0; i < count; i ++) {
            // caculate glyph vertex position
            float x0 = glyphs[i]->rect.origin.x;
            float y0 = glyphs[i]->rect.origin.y;
            float x1 = x0 + FONT_BITMAP_WIDTH;
            float y1 = y0 + FONT_BITMAP_HEIGHT;

            float positions[] = {
                x0, y1, 0.0, 1.0,
                x1, y1, 0.0, 1.0,
                x0, y0, 0.0, 1.0,
                x1, y0, 0.0, 1.0,
            };

            float textureCoords[] = {
                0.0f, 1.0f,
                1.0f, 1.0f,
                0.0f, 0.0f,
                1.0f, 0.0f,
            };

            // submit vertex and texture coordinate data
            glBufferSubData(GL_ARRAY_BUFFER, 
                            0, 
                            sizeof(positions), 
                            positions);
            glBufferSubData(GL_ARRAY_BUFFER, 
                            sizeof(positions), 
                            sizeof(textureCoords), 
                            textureCoords);

            // submit texture image data
            glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 
                            0, 
                            FONT_BITMAP_WIDTH * FONT_BITMAP_HEIGHT, 
                            glyphs[i]->bitmap_ref);
            glTexSubImage2D(GL_TEXTURE_2D,
                            0,
                            0,
                            0,
                            FONT_BITMAP_WIDTH,
                            FONT_BITMAP_HEIGHT,
                            GL_RED,
                            GL_UNSIGNED_BYTE,
                            0);

            // render glyph
            glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    }

    // present render result
    openglFlushBuffer();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...