【问题标题】:Scene refresh frozen场景刷新冻结
【发布时间】:2012-07-11 18:33:44
【问题描述】:

我渲染 2D(基于图块)场景并注册按键。按下箭头键时,我移动相机。尽管按键注册得很好,我的场景在我切换到另一个窗口并返回之前不会更新

你能告诉我是什么导致了问题吗?

PS。我正在 Linux 上工作,在 glut (freeglut) 的帮助下开发 OpenGL 应用程序。

我的渲染函数:

void render() {
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();

    if (s_map)
    for (int i = s_iCameraX; i < sc_iTilesY + s_iCameraY && i < s_map->usiHeight; i++)
    {
        for (int j = s_iCameraY; j < sc_iTilesX + s_iCameraX && j < s_map->usiWidth; j++)
        {
            short val = s_map->data[i][j];              
            if (val == 0x0010) glBindTexture(GL_TEXTURE_2D, texture[0]);
            else if (val == 0x0020) glBindTexture(GL_TEXTURE_2D, texture[1]);

            glBegin(GL_QUADS);
                glTexCoord2f(0.0f, 0.0f);   glVertex2f(j-s_iCameraX, i-s_iCameraY);
                glTexCoord2f(1.0f, 0.0f);   glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY);
                glTexCoord2f(1.0f, 1.0f);   glVertex2f(j-s_iCameraX+1.0f, i-s_iCameraY+1.0f);
                glTexCoord2f(0.0f, 1.0f);   glVertex2f(j-s_iCameraX, i-s_iCameraY+1.0f);
            glEnd();
        }
    }

glutSwapBuffers();
} 

我的特殊按键处理功能:

void keyproc(int key, int x, int y) {
    switch (key)
    {
    case GLUT_KEY_UP:
        printf("UP: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_iCameraY - 1 >= 0) s_iCameraY--;
        break;

    case GLUT_KEY_DOWN:
        printf("DOWN: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_map && s_iCameraY + 1 < s_map->usiHeight) s_iCameraY++;
        break;

    case GLUT_KEY_RIGHT:
        printf("RIGHT: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_map && s_iCameraX + 1 < s_map->usiWidth) s_iCameraX++;
        break;

    case GLUT_KEY_LEFT:
        printf("LEFT: %d %d\n", s_iCameraX, s_iCameraY);
        if (s_iCameraX - 1 >= 0) s_iCameraX--;
        break;

    default: break;
    }
}

【问题讨论】:

  • 你能展示你的主循环吗?
  • 我没有。我使用了 glut glutMainLoop() 函数。
  • 按下一个键后是否仍然调用render()(你可以用printf()跟踪它?你的空闲回调是什么?
  • render() 在按下一个键并切换一个窗口后调用(如果我理解你的话)并且我没有 IDLE 回调。是必须的吗?

标签: c++ linux opengl glut


【解决方案1】:

以下可能值得一试:添加空闲回调:

void idle(void)
{
    // Force GLUT to render the scene
    glutPostRedisplay();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-02
    • 2018-05-25
    • 1970-01-01
    • 2020-01-03
    • 2019-07-19
    • 1970-01-01
    • 2020-07-17
    • 2013-01-03
    相关资源
    最近更新 更多