2014-09-20 27 views
-1

在我的opengl程序中,我想让用户点击某个键时屏幕变成红色。在我my_keyboard功能,我有以下几点:Opengl形状不画在回调函数

void my_keyboard(unsigned char key, int x, int y) { 
    int feedback_code=0; 
    if (key == 49) { 
     feedback_code=1; 
    } 
    if (feedback_code==1) { 
     flash_screen(); 
    } 

我flash_screen方法如下:

void screen_flash() { 
    float mat[16]; 
    glGetFloatv(GL_MODELVIEW_MATRIX,mat); 

    glColor3f(1.0f,0.0f,0.0f); 

    glBegin(GL_POLYGON); 
    glVertex2f(0.0f, 0.0f); 
    glVertex2f(0.0f, 640.0f); 
    glVertex2f(888.0f, 640.f); 
    glVertex2f(888.0f, 0.0f); 
    glEnd(); 
} 

glGetFloatv电话,我知道我的变换矩阵是回到左下角哪里它应该是,在(0,0)点。所以绘图函数应该绘制一个红色方块888x640px,这是我窗口的大小。然而,当我运行程序并按下'1'键时,我没有形状!我使用了断点并确定了GlBegin-GlEnd语句运行,但它们似乎没有产生任何东西。

我唯一的其他形状是在main_loop启动之前调用的主显示函数中完成的。

我在做什么错?

+0

_“通过glGetFloatv调用,我知道我的变换矩阵回到了它应该在的左下角,在点(0,0)”_这是不正确的。通过'glGetFloatv',您可以将当前的模型视图矩阵存储到'mat'中,而不是其他任何东西。你确定你正在设置正确的投影和模型视图矩阵吗? – Dan 2014-09-20 00:57:10

+0

如果我的'mat'显示单位矩阵,这是我想要的这种情况下,这不意味着我当前的转换矩阵在(0,0)? 根据我在我的主要显示功能中所做的绘图,我的投影和模型视图矩阵是正确的。除非你进入主循环时发生了什么事情,我不认为是这样。 – sven 2014-09-20 01:03:51

回答

1

这是一个常见的新手错误。因此,这里是一般规则:切勿从事件处理程序进行OpenGL绘图调用。决不!

当您想要屏幕上的某些内容发生与输入事件相关的反应时,请设置一些标志变量并发出重绘信号。然后在绘图函数中根据信号绘制。