我正在尝试从 OGLSuperbible 中完成 OpenGL 中的一些基本示例。基本上,我将使背景从红色变为橙色,再变为绿色,然后再变回。
这是我使用的代码:
typedef float F32;
void Example1::Render(void) {
time += 0.20f;
const GLfloat color[] = { (F32)sin(time) * 0.5f + 0.5f,
(F32)cos(time) * 0.5f + 0.5f,
0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, color);
}
我有一个精确计时器,可以测量最后一帧的增量时间,但是,任何时候我调用 sin
和 cos
函数时, >1
,它只是让屏幕保持绿色。但是,如果我硬编码要更改的值,就像我所做的那样,如果我将它增加 1
或更多,它会很快在颜色之间闪烁(就像狂欢)。我不确定为什么这些函数不适用于 float 。我正在使用 visual studio,并且包含了 math.h
header 。有没有人见过这样的事情?
更新:根据建议,我尝试了一些代码。我通过添加以下内容使程序具有我正在寻找的效果:
测试我的代码,我手动输入以下内容:
在构造函数中:
Example1(void): red(0.0f), green(1.0f), interval(0.002f), redUp(true), greenUp(false).....
在渲染循环中
if (red >= 1.0f) { redUp = false; }
else if (red <= 0.0f) { redUp = true; }
if (green >= 1.0f) { greenUp = false; }
else if (green <= 0.0f) { greenUp = true; }
if (redUp) { red += interval; }
else { red -= interval; }
if (greenUp) { green += interval; }
else { green -= interval; }
const GLfloat color[] = { red, green, 0.0f, 1.0f };
它做了它应该做的,但是使用带有 float 的 sin 和 cos 函数没有变化。我对为什么感到困惑,我假设给 sin 和 cos 时间浮点值是可行的。我曾尝试手动计算时间,手动将其递增 1/60 秒,但每当我使用小于 1.0f 的 sin 和 cos 时,它只会保持绿色。
最佳答案
看来您的时间间隔太大了。如果你只是假设你以 60fps 的速度运行(如果你不限制它可能是数百帧)那么增量时间应该是每帧 0.01667 (1/60) 秒。每帧增加 0.2(特别是当您的刷新率超过 60fps 时)将导致频闪。
如果您使用的是 C++11,我建议您使用 Chrono 库并获取要使用的确切数字。这在 this post 中有详细记录.
一旦您使用实际时间,请记住 sin
和 cos
采用弧度,而不是度数。范围只有 [0, 2PI) 所以除了只传入你的 time
变量之外,将它乘以一些小的因子并使用这个数字:
time += 0.01667f;
F32 adjustedTime = time * 0.02; // OcillationSpeed
const GLfloat color[] = { (F32)sin( adjustedTime ) * 0.5f + 0.5f,
(F32)cos( adjustedTime ) * 0.5f + 0.5f,
...
此外,我不知道您是否只是忽略了将其添加到此问题中,但不要忘记在设置清晰颜色后调用 glClear(GL_COLOR_BUFFER_BIT);
。
关于c++ - OpenGL 中的振荡颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30282607/