在 glutKeyboardFunc 中进行的 OpenGL 状态更改不会立即可见

Posted

技术标签:

【中文标题】在 glutKeyboardFunc 中进行的 OpenGL 状态更改不会立即可见【英文标题】:OpenGL state changes made in glutKeyboardFunc are not visible immediately 【发布时间】:2012-10-02 20:12:07 【问题描述】:

我有一个函数 glutKeyboardFunc(keyboard),其中键盘有:

void keyboard(unsigned char key, int x, int y)
    float alpha = 1.0;
    switch(key)
    case 'c':
        glClearColor(1,0,0,alpha);
        printf("success");
        break;
    

这是对函数的总结;它可以正常工作,但只有在发生其他一些操作后才能正常工作。例如,printf 语句在击键 'c' 时立即报告成功,但在我单击画布上的其他位置之前,背景颜色不会变为活动状态。我希望所有击键都能立即生效。

【问题讨论】:

需要更多代码(例如您的 glutDisplayFunc 实现)。标题也令人困惑,因为 glutkeyboardFunc 与鼠标无关。 你说得对,标题有点误导,但我认为这个问题总结得很好。我会添加显示功能,但评论者已经回答了我的问题,所以没有必要。我会尽可能接受答案(8 分钟) 【参考方案1】:

你需要刷新屏幕:

void keyboard(unsigned char key, int x, int y)
    float alpha = 1.0;
    switch(key)
    case 'c':
        glClearColor(1,0,0,alpha);
        printf("success");
        glutPostRedisplay(); // trigger the screen redisplay
        break;
    

【讨论】:

谢谢,我只需要习惯在我猜想的任何地方都必须使用该函数。 或者他可以遵循约定并使用 glutIdleFunc 最好设置一些程序变量,而不是直接调用glClearColor。一旦您在每次渲染一帧时多次设置清晰的颜色(相信我,迟早会发生的!)在输入事件处理程序中执行此操作将会中断。 @datenwolf 直接调用 glClearColor 是什么意思?据我所知, glutPostRedisplay() 会设置一些变量来尽快触发重新显示,因此不需要额外的变量。或者,我错了吗? @BЈовић:如果您在显示功能上绘制到多个区域(想想小地图、HUD、增强现实叠加)并因此在那里多次设置清晰的颜色怎么办?作为一般规则,可以被视为绘图调用(并且清除是一种绘图操作)的 OpenGL 调用应该放在显示函数中,而不应放在其他任何地方。

以上是关于在 glutKeyboardFunc 中进行的 OpenGL 状态更改不会立即可见的主要内容,如果未能解决你的问题,请参考以下文章

Opengl_12_相机控制

限制 fps 过剩

将成员函数指针转换为 FreePascal 中的函数指针

在 iOS 中同时使用两个音频单元进行 I/O 是不是安全?

Node.js中的异步I/O是如何进行的?

如何在 O(n) 时间内对双向链表进行二进制搜索?