我正在研究一个简单的OpenGL应用程序,它允许用户通过单击并拖动到左侧(使其不太强烈)或右侧(更强烈)来调整简单窗口的背景颜色。例如,当向右拖动时,我有这样的东西:
intensity += 0.0001*x; //where x is the current mouse location
......在左边,另一种方式:
intensity -= 0.0001*x;
intensity
是全局静态GLfloat,它在显示函数中传递给glClearColor
,该函数被多次调用。当用户在向右拖动的同时加强颜色时,此策略可以正常工作,但在向左拖动时会在某个点之后变得混乱:当我拖动时颜色变得不那么强烈并且返回到应该的黑色,但随后又加强回到原色。
我认为问题在于,当我拖得太远时强度(应该在0和1之间)变为负值,因此glClearColor
通过将符号改回正值来解决问题( ?)。如果是这种情况,我如何强制传递给glClearColor
的值保持在适当的范围内?我试图通过确保当前强度不会变为负值来解决问题/如果它已经太低则不会发生调整,但它似乎不起作用:
if(x <= xPrev && intensity >= (.0001*x)) //moving left to de-intensify color
intensity -= 0.0001*x;
...我这样做是错误的,还是glClearColor
处理负值的方式与我预期的不同?
另一个有趣的问题是我的“强度”调整似乎只适用于r,g和/或b值(即,我将“强度”作为glClearColor
中的一个传递。使用a值不起作用......但它不应该改变颜色强度吗?
答案 0 :(得分:1)
这听起来有点像hysteresis问题。目前尚不清楚接收事件的方式,或者x
坐标系是什么。或许在按下按钮时会删除“锚点”(xStart
),并在拖动时自动处理所有后续值这个价值。你用于Windows和事件的工具包/库是什么?如果从控制台启动,可能会添加跟踪语句,如:
fprintf(stderr, "%.8e\n", x);
查看x
的值是否与您在每个帧上所期望的值相对应。
glClearColor会将值限制为[0, 1]
,因此可能不是问题所在。也许intensity
的痕迹会有用吗?