在 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 状态更改不会立即可见的主要内容,如果未能解决你的问题,请参考以下文章