问题参考:
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);
}
现在再次使用上面的代码。
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)进行播放 有趣的模式和行为。
答案 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
可以是你想要的任何表达式(函数调用的结果,常量,某些运算符链的结果,如乘法等)。
* 等号和初始值是可选的