Символ идет по диагонали по разным размерам шрифта в шрифте c++ opengl true type

Я пытался заставить TTF работать с моим проектом OpenGL, и это самое близкое, к чему я пришел, вот мой код:

#include "App.h"

std::array <float, 4> background_col = {0.25, 0.25, 0.25, 1.0}  ;
std::string name                     = "OpenGL"                 ;
std::string icon                     = "data/images/dot.png"    ;
const int width                      = 800                      ;
const int height                     = 800                      ;
bool anti_aliasing                   = true                     ;
bool FPS_60_CAP                      = true                     ;
bool movable                         = false                    ;
    
Core::Base::MVP mvp;

int a = 32;

void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
{
    if (action == GLFW_PRESS) { a += 1; }
    info(a);
}

double mouseX, mouseY;
double pmouseX, pmouseY;

glm::vec2 t(0);

void mouse(GLFWwindow * window) {
    pmouseX = mouseX;
    pmouseY = mouseY;

    double xpos, ypos;
    glfwGetCursorPos(window, &xpos, &ypos);
    mouseX = xpos;
    mouseY = height - ypos;

    if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT)  && movable) {
        t.x += mouseX - pmouseX;
        t.y += mouseY - pmouseY;
        mvp.translate(0, t);
    }
}

void App::run()
{
    Core::Window window(true, anti_aliasing);
    window.make_Window(glfwCreateWindow(width, height, name.c_str(), NULL, NULL), key_callback, icon);

    srand(time(NULL));
    mvp.view = glm::ortho(0.0f, (float)width, 0.0f, (float)height);

    Core::Renderer renderer;
    Core::Player player;

    // 1. TODO: Implement Text
    // 2. TODO: Implement UI

    FT_Library ft;
    FT_Error err = FT_Init_FreeType(&ft);
    
    if (err != 0) {
        printf("Failed to initialize FreeType\n");
        exit(EXIT_FAILURE);
    }
    
    FT_Int major, minor, patch;
    FT_Library_Version(ft, &major, &minor, &patch);
    printf("FreeType's version is %d.%d.%d\n", major, minor, patch);
    
    FT_Face face;
    err = FT_New_Face(ft, "data/fonts/arial.ttf", 0, &face);

    if (err != 0) {
        printf("Failed to load face\n");
        exit(EXIT_FAILURE);
    }

    while (!glfwWindowShouldClose(window.window))
    {
        glClearColor(background_col[0], background_col[1], background_col[2], background_col[3]);
        glClear(GL_COLOR_BUFFER_BIT);

//        mouse(window.window);
//        renderer.Render({ Core::Draw::Ellipse({400, 400, {1,0,1,1}}, 100, 75, true) }, mvp);

        err = FT_Set_Pixel_Sizes(face, 0, a);
    
        if (err != 0) {
            printf("Failed to set pixel size\n");
            exit(EXIT_FAILURE);
        }
        
        FT_UInt glyph_index = FT_Get_Char_Index(face, 'o');
        FT_Int32 load_flags = FT_LOAD_DEFAULT;
        
        err = FT_Load_Glyph(face, glyph_index, load_flags);
        
        if (err != 0) {
            printf("Failed to load glyph\n");
            exit(EXIT_FAILURE);
        }
        
        err = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
        
        if (err != 0) {
            printf("Failed to render the glyph\n");
            exit(EXIT_FAILURE);
        }

        glDrawPixels( face->glyph->bitmap.width, face->glyph->bitmap.rows, GL_ALPHA, GL_UNSIGNED_BYTE, face->glyph->bitmap.buffer);

        Core::viewport(window.window);
        glfwSwapBuffers(window.window);
        glfwSwapInterval(FPS_60_CAP);
        glfwPollEvents();
    }
    
    alcCloseDevice(player.Device);
    window.~Window();
}

вот пример того, что я имею в виду: Ошибка

Иногда он отображается правильно, но когда вы меняете размер шрифта, он искажается, и я не понимаю, что я сделал не так, любая помощь будет оценена!

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию предполагается, что каждая строка пикселей выровнена по 4 байтам, но ваши данные пикселей вообще не выровнены. Вы можете изменить требования к выравниванию, установив GL_UNPACK_ALIGNMENT (см. glDrawPixels и glPixelStore):

glPixelStore(GL_UNPACK_ALIGNMENT, 1);
glDrawPixels( face->glyph->bitmap.width, face->glyph->bitmap.rows, GL_ALPHA, GL_UNSIGNED_BYTE, face->glyph->bitmap.buffer);

Другие вопросы по теме