c++ - OpenGL 中的振荡颜色

标签 c++ opengl visual-studio-2012

我正在尝试从 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);
}

我有一个精确计时器,可以测量最后一帧的增量时间,但是,任何时候我调用 sincos 函数时, >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 中有详细记录.

一旦您使用实际时间,请记住 sincos 采用弧度,而不是度数。范围只有 [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/

相关文章:

c++ - 如何按值而不是键在容器中查找对象

opengl - 如何调试 GLSL 着色器?

c# - DependencyProperty 编译并工作,但 Intellisense 不这么认为

c++ - 如何解决 MSVC 2012 中的 `using K = ...`?

visual-studio-2012 - VS 安装项目

c++ - 虚函数机制实现

c++ - &符号 "&"在指针前面做什么?

C++11 虚拟拷贝构造函数

objective-c - 如何将视频效果应用到 osx 中的 native 应用程序

c - OpenGL 着色器变量传递