如何减慢GLSL中sin()波的频率?

时间:2017-02-09 04:44:19

标签: glsl shader

问题参考:

http://thebookofshaders.com/03/

#ifdef GL_ES
precision mediump float;
#endif

uniform float u_time;

void main() {
    gl_FragColor = vec4(abs(sin(u_time)),0.0,0.0,1.0);
}

Live Code Example

  

现在再次使用上面的代码。

     

1 - 减慢频率,直到颜色变化几乎察觉不到。

     

2 - 加速直至看到单一颜色而没有闪烁。

     

3 - 以不同频率的三个声道(RGB)播放,以获得有趣的模式和行为。

第一次问:

  

1 - 减慢频率,直到颜色变化几乎变为   感觉不到的。

我尝试将u_time划分/乘以产生语法错误。 uniform float u_time/2; // ERROR,我只是难以理解作者希望我学习的内容。在没有理解的情况下,我很难在阅读材料中前进。

也许作者的问题要我不要使用abs(sin(u_time))而是另一个函数:

  

GPU具有硬件加速角度,三角函数和指数函数。

     

其中一些功能是:sin(),cos(),tan(),asin(),acos(),   atan(),pow(),exp(),log(),sqrt(),abs(),sign(),floor(),ceil(),   fract(),mod(),min(),max()和clamp()。

如果是,我将使用哪个功能来完成下面所述的要求?

我是否也可以获得帮助,了解如何解决:2和3

  

2 - 加速直至看到单一颜色而没有闪烁。

     

3 - 使用不同频率的三个声道(RGB)进行播放   有趣的模式和行为。

1 个答案:

答案 0 :(得分:2)

不理解前进!实际上,我非常怀疑你是否能做到这一点。这是该语言的核心部分!

要在GLSL中重新分配变量,语法如下:

variable = new_value;

由于您希望新值依赖于旧值,因此您只需使用该变量:

variable = variable * 2;

但是GLSL对它的数字类型很挑剔,所以因为u_time是一个浮点数,你必须乘以浮点数(或除以,或者你做的任何事情):

u_time = u_time * 2.0f;

现在你有时间乘以2,这意味着频率的两倍!或者,如果您不想更改变量的值,只需要传递给颜色的值,您可以像JS一样(我看到您之前有使用它的经验,所以这就是我正在比较的,但它是非常标准的跨语言):

gl_FragColor = vec4(abs(sin(u_time * 2.0f)),0.0,0.0,1.0);

#2只是为分区更改2,或使用0到1之间的数字。

对于#3,您对vec4构造函数的其他字段使用非常量值,例如,您可以使用更多正弦波并添加一些偏移量,以生成多种颜色。

有关您的错误的更多技术信息:

语法

modifier type name = value;

保留用于变量声明 *,它只应发生一次(如JavaScript中的var)。

但是,您可以根据需要更改已声明的变量的值,其语法仅为

name = value;

value可以是你想要的任何表达式(函数调用的结果,常量,某些运算符链的结果,如乘法等)。

* 等号和初始值是可选的