Заменить текст на события с помощью библиотеки рендеринга шрифтов GLC Opengl - PullRequest
0 голосов
/ 21 мая 2018

Я визуализировал шрифт в окне OpenGL с помощью библиотеки GLC, но теперь, если я хочу применить некоторые операции к визуализированному шрифту, он заканчивается как ошибка сегментации.

Код дляВизуализация шрифта, как показано ниже,

char * msg = "ABCD";
void drawString(char* name, int x, int y){
    ctx = glcGenContext();
    glcContext(ctx);    
    myFont = glcGenFontID();
    glcNewFontFromFamily(myFont, "Courier");
    glcFont(myFont);
    glEnable(GL_LINE_SMOOTH);
    glViewport(0, 0, 500, 500);
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity();          
    glOrtho(0.0, 500.0, 500.0, 0.0, -1.0, 1.0); 
    glMatrixMode(GL_MODELVIEW); 
    glcScale(20,20);
    glColor3f(1,0,0);
    glPushMatrix(); 
    glRasterPos3f(x,y,0);
    glcRenderString(name);
    glPopMatrix();
}

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_E && action == GLFW_PRESS)
        msg = "abcd";
}

int main()
{
    if (!glfwInit())
        exit(EXIT_FAILURE);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
    GLFWwindow* window = glfwCreateWindow(500, 500, "font rendering", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    glewExperimental = GL_TRUE;
    glfwSwapInterval(1);
    if ( GLEW_OK != glewInit( ) )
    {
        std::cout << "Failed to initialize GLEW" << std::endl;
    }

    glfwSetKeyCallback(window, key_callback);
    GLint ctx, myFont;

    while(!glfwWindowShouldClose(window)){
        drawString(msg, 100, 100);
        glfwPollEvents();
        glfwSwapBuffers(window);
    }
}

при нажатии E, он должен изменить ABCD на abcd, но он не заменяет исходный текст, он смешивает два текста.

Я понял, что есть проблема в создании контекста и его правильном использовании, я также пытался использовать glcDeleteContext(), но он также делает то же самое.

1 Ответ

0 голосов
/ 21 мая 2018

Вы должны очистить буфер цвета из кадрового буфера по умолчанию перед рисованием сцены.Если буфер цвета не очищен, он остается неизменным, и поверх него рисуется новый рендеринг.

Используйте для этого glClear:

while(!glfwWindowShouldClose(window)){
    glClear( GL_COLOR_BUFFER_BIT );
    drawString(msg, 100, 100);
    glfwPollEvents();
    glfwSwapBuffers(window);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...