Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL中的振荡颜色_C++_Opengl_Visual Studio 2012 - Fatal编程技术网

C++ OpenGL中的振荡颜色

C++ OpenGL中的振荡颜色,c++,opengl,visual-studio-2012,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.

我试图完成一些来自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
或更多,它将在颜色之间非常快地闪烁(就像狂欢一样)。我不知道为什么这些函数对浮点数不起作用。我使用的是visual studio,其中包含了
math.h
标题。以前有人见过这样的东西吗

更新:基于这些建议,我尝试了一些代码方面的东西。通过添加以下内容,我获得了我想要的效果:

在测试代码时,我手动输入以下内容:

在构造函数中:

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 };
如果(红色>=1.0f){redUp=false;}
如果(红色=1.0f){greenUp=false;}

否则,如果(绿色看起来你的时间间隔太大了。如果你只是假设你以60fps的速度运行(如果你不限制它,它可能是数百),那么增量时间应该是每帧0.01667(1/60)秒。每帧增加0.2(特别是当你的刷新率超过60fps时)将导致笔划

如果您使用的是C++11,我建议您使用Chrono库并获得要使用的确切数字。这在中有很好的说明

使用实际时间后,请记住
sin
cos
取弧度,而不是度数。范围仅为[0,2PI),因此除了只传递
时间
变量外,还可以将其与一些小因子相乘,然后使用该数字:

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\u COLOR\u BUFFER\u BIT)

我认为您需要通过glutSwapBuffers()刷新屏幕; 我有此代码,我可以毫无困难地更改背景颜色:

void RenderScene(void)
    {
    // Clear the window with current clearing color
    //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

        time+=0.2;
        const GLfloat color[]={sin(time)*0.5f+0.5f,cos(time)*0.5f+0.5f,0.0f,1.0f};
        glClearBufferfv(GL_COLOR,0,color);
    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    triangleBatch.Draw();



    // Perform the buffer swap to display back buffer

    glutSwapBuffers();
    }
我得到了这些结果
感谢所有的输入。经过深入挖掘,我找到了我的问题所在。我认为这是合乎逻辑的,但事实并非如此。这是一个语法错误。下面是产生与您看到的相同结果的代码:

    const GLfloat color[] = { F32(sin(curTime)) * 0.5f + 0.5f,
                          F32(cos(curTime)) * 0.5f + 0.5f,
                          0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, color);

区别在于使用(F32)sin…或F32(sin(…我不是100%知道这是为什么,但我认为这与我为F32类型设置的typedef调用构造函数有关,我之所以这么做是因为Jason Gregory在《游戏引擎架构》(Game Engine Architecture)一书中给出了一些建议。无论如何,感谢您与我一起完成这项工作。

F32是我们的别名吗浮点类型?是的。很抱歉,我没有包括它。这是定义:typedef float F32;谢谢你的建议,我已经尝试了你的想法,但屏幕仍然保持相同的颜色。当我添加一个断点,然后查看值时,它看起来像它,因为帧之间的颜色漂移不足以实际显示c更改颜色。颜色最终大约为(0.55、.99、0.0)和(0.59、0.99.0.0)。我确信我只是不理解这里的某些内容,您在代码中看到的实际颜色是什么?或者您尝试过了吗?从(0.55、0.99、0.0)更改为(0.59、0.99、0.00)如果假设动画速度为60 fps,则速度明显且实际上相当快。我感觉我错过了一些重要的东西。当我运行程序时,如果时间小于1,打开的窗口将保持绿色。如果时间大于1,则会出现闪烁效果。有人看到我错过了什么吗?我确信错误在我的思维中。@MaxwellMi你的
time
变量实际上是浮点型的吗?是的,我试过它作为双精度和浮点型。即使作为双精度或浮点型,如果值等于1.0f,它会迅速改变颜色,但是如果值小于1.0f,包括0.9999999f,它就会保持绿色,并且根本不会改变。我真的这样做了我不知道。实际上我在主循环中调用交换缓冲区,虽然我确实认为这是问题所在。下面我来解决我的问题,但是我很欣赏这种洞察力。