【问题标题】:How to slow down the frequency of a sin() wave in GLSL?如何减慢 GLSL 中 sin() 波的频率?
【发布时间】:2017-02-10 03:41:04
【问题描述】:

问题参考:

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) 以获得 有趣的模式和行为。

【问题讨论】:

    标签: glsl shader


    【解决方案1】:

    没有理解就不要前进!实际上,我非常怀疑您是否可以做到这一点。它是语言的核心部分!


    要在 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 可以是您想要的任何表达式(函数调用的结果、常量、某些运算符链(如乘法)的结果等)。

    *等号和初值可选

    【讨论】:

    • 如此简单。感谢您的精彩回答!
    • @Himal 你应该问一个正确的问题!但是制服是特定于着色器运行的环境(渲染器,可能还有任何其他代码),所以你应该检查你正在使用的库的文档。
    • 没关系,我想我找到了here,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2023-03-31
    • 1970-01-01
    • 2016-06-11
    • 2016-11-26
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多