脉动/闪烁RGBA颜色?

时间:2017-03-05 08:17:14

标签: math colors rgba

所以在我的程序中,颜色的定义就像这样,例如

//R, G, B, A
float red[4] = { 1, 0, 0, 1 };

float green[4] = { 0, 1, 0, 0.5 };//green[3] = 0.5; this mean opacity is at 50%

float blue[4] = { 0, 0, 1, 0.2 };blue[3] = 0.2; this mean opacity is at 20%

我的问题是,我怎么能使颜色平滑脉动/闪光?我对完成我想要的数学非常困惑。

例如,如果我要淡入淡出颜色,我会这样做

float color[4] = { 1, 0, 0, 1 };
void fadeColorInAndOut(float * Colorin)
{
    for(float i = 1; i > 0; i-= 0.01f)
    {
        Colorin[3] = i;
        sleep(10);//10 milliseconds
    }
    for(float i = 0; i < 1; i+= 0.01f)
    {
        Colorin[3] = i;
        sleep(10);//10 milliseconds
    }
}

但是当谈到实际的脉动/闪烁颜色时,我真的不知道从哪里开始。

为了帮助您了解更多,这是我正在寻找的那种效果。这是我发现的GIF,它非常完美地展示了我想要的效果

enter image description here

1 个答案:

答案 0 :(得分:1)

有更多方法可以做到这一点:

  1. 在随机颜色之间进行插值
  2. 在预定义的颜色表之间进行插值
  3. 使用连续功能
  4. 这里是#3的简单C ++示例:

    void iterate(float *col,float t)
     {
     col[0]=cos(0.5*t); // the coefficients gives you frequency of change
     col[1]=cos(0.3*t); // different numbers between bands will give you colors
     col[2]=cos(0.1*t);
     }
    
    void main()
     {
     float t=0.0;
     float col[4]={0.0,0.0,0.0,1.0};
     for (;;)
      {
      iterate(col,t);
      // here render your colored stuff
      Sleep(10); t+=0.01; // speed of pulsation [rad/10ms]
      // here test end of program condition and break if needed...
      }
     }
    

    所有方法都只是及时计算函数值(基于随机值,点表,数学函数)。将每个色带处理为单独的功能和每个迭代步骤后的步进时间。

    如果您知道要实现的颜色模式,则创建一个表格并在它们之间进行插值。这里有一些链接可以帮到你: