我正在开发一个简单的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中的一个传递。)没用...但是它不应该改变颜色强度吗?

最佳答案

这听起来有点像hysteresis问题。目前尚不清楚事件是如何接收的,或者是什么坐标系x。可能在按下按钮时放下“锚点”(xStart),并处理所有后续值,同时拖动该值作为偏移量。您使用什么工具包/库来处理Windows和事件?如果从控制台启动,则可能添加跟踪语句,例如:

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

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

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

关于c - 用负参数调用glClearColor时会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12593559/

10-10 19:23