использование glutBitmapCharacter () для рисования текста, закрывающего программу opengl - PullRequest
1 голос
/ 31 октября 2019

Когда я пытаюсь нарисовать текст с помощью функции drawText(), функция работает плавно, но когда она достигает glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);, программа неожиданно закрывается. Я проверил, что именно эта конкретная часть функции вызывает это, как если бы я где ее удалить и заменить на printf("Hello World!\n");, программа не падает.

Основная функция:

int main(void) {
    GLFWwindow* window;
    int width = 840, height = 640;
    if (!glfwInit()) {
        printf("failed to init glfw");
        return -1;
    }

    window = glfwCreateWindow(width, height, "ElectroCraft", NULL, NULL);
    glfwMakeContextCurrent(window);
    if (!window) {
        printf("failed to start window");
        glfwTerminate();
        return -1;
    }
    glEnable(GL_DEPTH_TEST);
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, 0, height, 0, 1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    while (!glfwWindowShouldClose(window)) {
        glClearColor(53.0f / 255.0f, 81.0f / 255.0f, 92.0f / 255.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glBegin(GL_LINES);
        glVertex2f(0, height-80);
        glVertex2f(width, height - 80);
        glEnd();

        string text;
        text = "Hello World!";
        //glutBitmapCharacter(GLUT_BITMAP_9_BY_15, int(text[1]));
        drawText(text.data(), text.size(), 50, 100);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
    return 1;
}

Функция drawText:

void drawText(const char* text, int length, int x, int y) {
    glMatrixMode(GL_PROJECTION);
    double* matrix = new double[16];
    glGetDoublev(GL_PROJECTION_MATRIX, matrix);
    glLoadIdentity();
    glOrtho(0, 800, 0, 600, -5, 5);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
    glLoadIdentity();
    glRasterPos2i(x, y);
    for (int i=0; i < length; i++) {
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
        printf("Hello world!\n");
    }
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixd(matrix);
    glMatrixMode(GL_MODELVIEW);
}

Я не совсем уверен, что мой код не лучший, или есть ошибка в библиотеке freeglut. Просто чтобы быть ясно, я использую freeglut.

1 Ответ

1 голос
/ 31 октября 2019

Если вы хотите использовать любую функцию из библиотеки GLUT , тогда GLUT необходимо инициализировать с помощью glutInit. Например:

int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    // [...]
}
...