使用负参数调用glClearColor会发生什么?

时间:2012-09-26 02:01:41

标签: c opengl colors

我正在研究一个简单的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值不起作用......但它不应该改变颜色强度吗?

1 个答案:

答案 0 :(得分:1)

这听起来有点像hysteresis问题。目前尚不清楚接收事件的方式,或者x坐标系是什么。或许在按下按钮时会删除“锚点”(xStart),并在拖动时自动处理所有后续值这个价值。你用于Windows和事件的工具包/库是什么?如果从控制台启动,可能会添加跟踪语句,如:

fprintf(stderr, "%.8e\n", x);

查看x的值是否与您在每个帧上所期望的值相对应。

glClearColor会将值限制为[0, 1],因此可能不是问题所在。也许intensity的痕迹会有用吗?