0

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

4

1 回答 1

1

这听起来有点像滞后问题。目前尚不清楚事件是如何接收的,或者在哪个坐标系中。可能会在按下按钮时x放下一个“锚”(xStart您将什么工具包/库用于窗口和事件?如果您从控制台启动,可能会添加如下跟踪语句:

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

查看 的值是否x与您对每一帧的期望相对应。

glClearColor 将值钳位到[0, 1],所以这可能不是问题。也许跟踪intensity会有用?

于 2012-09-26T02:51:31.220 回答