【Three.js基础学习】24. shader patterns

news2024/11/19 5:07:25

前言

课程回顾:

        ShaderMaterial 这里用的是着色器材质

        所以顶点和片段着色器就不需要像原始着色器那样添加需要的属性 然后写

        片段着色器需要属性 : 顶点 属性 -》变化 -》 片段中

                            顶点中的属性不需要声明 只需要声明传送的变量 例如 varying vec vUv; vUv = uv;

        补充:uv 关于二维坐标,用于放置纹理或东西

                平面二维坐标 左下角开始 x, y (0.0 - 1.0 / 0.0 - 1.0)

下面图片是一些参考理解示意图

        图片想象成数字,数字大小想象成颜色强度


一、在片段着色器中实现一些效果

1.实现颜色的改变

在片段着色器中引入了向量vUv,同时我们创建vec4 等于对应的gl_FragColor 

vec4 的参数 对应 rgba,  r(红色)g(绿色) b(蓝色) a(阿尔法) 对应颜色

                也可以叫xyza;x轴,y轴,z轴 , a(透明) 对应位置

对应值0.0 - 1.0

如何实现红蓝渐变

下方代码使用的是GLSL

varying vec2 vUv;

void main()
{
    gl_FragColor = vec4(vUv,1.0, 1.0); // 这里改变颜色
}

varying vec2 vUv;
void main()
{
    gl_FragColor = vec4(vUv,0.0, 1.0);
}

2.着色器黑白变化颜色设置

2.1 右渐变

varying vec2 vUv;
void main()
{
     float strength = vUv.x;
     gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变
}

2.2 上渐变

varying vec2 vUv;
void main()
{
     float strength = vUv.y;
     gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变
}

2.3下渐变

varying vec2 vUv;
void main()
{
     float strength = 1.0 - vUv.y;
     gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变
}

2.4 上渐变重复

    mod(X, Y)函数返回X对Y取模的结果。如果X和Y都是数组,mod函数会对数组的每个元素分别进行取模运算

        对上一步的结果取模 1.0,即计算该值除以 1.0 的余数。

        由于取模 1.0 的效果是将值限制在 0 到 1 之间(不包括1)

        ,这个操作实际上是在做一个周期性变换,

        使得 vUv.x 在 0 到 10 之间变化时,结果会在 0 到 1 之间循环

varying vec2 vUv;
void main()
{
      float strength = mod(vUv.y * 10.0,1.0);
     gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变
}

2.5 y白色条形

step(edge,x) 如果x < edge,返回0.0,否则返回1.0 ; x白色条形做法相同不过将数据y改成x

varying vec2 vUv;

void main()
{
    float strength = mod(vUv.y * 10.0,1.0);
    strength = step(0.5,strength);


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变
    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 


}

调整条形的大小

varying vec2 vUv;

void main()
{
    float strength = mod(vUv.y * 10.0,1.0);
    strength = step(0.8,strength); // 设置最大界限 可以调整


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变
    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 


}

2.6 网格

思路类似于x,y重叠,相加就有了

varying vec2 vUv;

void main()
{
   // patten 12
    float strength = step(0.8,mod(vUv.x * 10.0,1.0));
    strength += step(0.8,mod(vUv.y * 10.0,1.0));

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.7 网格白点

varying vec2 vUv;

void main()
{

    // patten 13
    float strength = step(0.8,mod(vUv.x * 10.0,1.0));
    strength *= step(0.8,mod(vUv.y * 10.0,1.0));


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

改变点的长度

varying vec2 vUv;

void main()
{

    // patten 14
    float strength = step(0.4,mod(vUv.x * 10.0,1.0));
    strength *= step(0.8,mod(vUv.y * 10.0,1.0));


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.8 角,十字架

思路就是,白点 x, y 相加

varying vec2 vUv;

void main()
{

    // patten 15
    float barX = step(0.4,mod(vUv.x * 10.0,1.0));
    barX *= step(0.8,mod(vUv.y * 10.0,1.0));

    float barY = step(0.8,mod(vUv.x * 10.0,1.0));
    barY *= step(0.4,mod(vUv.y * 10.0,1.0));

    float strength = barX;
    strength += barY;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

思路,改变x,y 角的位置

varying vec2 vUv;

void main()
{

     // patten 16
    float barX = step(0.4,mod(vUv.x * 10.0,1.0));
    barX *= step(0.8,mod(vUv.y * 10.0 + 0.2,1.0));

    float barY = step(0.8,mod(vUv.x * 10.0 + 0.2,1.0));
    barY *= step(0.4,mod(vUv.y * 10.0,1.0));

    float strength = barX;
    strength += barY;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.9 中间渐变,折角渐变,对角渐变

想象坐标轴1.0 - 0.0  , 一个U型 , 就是1.0 -  0.0 - 1.0  所以

   abs() 绝对值

varying vec2 vUv;

void main()
{

    // patten 17
    float strength = abs( vUv.x - 0.5);

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

折角,就是x,y 中间y渐变完成 , 在加上x 就行

min() 最小值

max() 最大值

varying vec2 vUv;

void main()
{

// patten 18
    float strength = min(abs( vUv.x - 0.5),abs( vUv.y - 0.5)) ;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.10 口型,正方形

参考上面最大值的形状, 中间数值小,两边数值高

根据step 设置界限

varying vec2 vUv;

void main()
{

    // patten 19
    // float strength = max(step(0.2,abs( vUv.x - 0.5)),step(0.2,abs( vUv.y - 0.5)));
    float strength = step(0.2,max(abs( vUv.x - 0.5),abs( vUv.y - 0.5)));

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

如何变小,上面有一个口, 1-上面的数值 ,相当中间正方形(0.25大一点),相乘取反

varying vec2 vUv;

void main()
{

 // patten 20
    float square1 = step(0.2,max(abs( vUv.x - 0.5),abs( vUv.y - 0.5)));
    float square2 = 1.0 - step(0.25,max(abs( vUv.x - 0.5),abs( vUv.y - 0.5)));
    float strength = square1 * square2;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.11 渐变(阶级分明)

上面右渐变,如何变成阶级分明

  floor() 向下取整

0.0 - 1.0 逐渐变大这是右渐变, 0.01,0.11,0.22,... 1.0

向下取整 0.01/ 0 ; 0.11   : 0 ; 1.0 : 1

乘10变整数取整 ,0.0 /0, 0.1/0,... 1.0/ 1,1.1/ 1,.... 2.0/2, 2.1/2 ..... 10/10

除10恢复数据

varying vec2 vUv;

void main()
{

    // patten 21
    float strength = floor(vUv.x * 10.0) / 10.0;  // vUv.x * 10.0  ,0 - 10; floor(vUv.x * 10.0) / 10.0 , 0-0.1-0.2-...1.0


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.12 网格渐变

上面已经实现x轴条形渐变,乘上y就行

varying vec2 vUv;

void main()
{

 // patten 22
     float strength = floor(vUv.x * 10.0) / 10.0;
     strength *= floor(vUv.y * 10.0) / 10.0;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.13 随机

varying vec2 vUv;

float random(vec2 st){ // 随机数 ,了解可参考:https://thebookofshaders.com/10/
    return fract(sin(dot(st.xy,vec2(12.9898,78.233))) * 43758.5453123);
}
void main()
{

  // patten 23
    float strength = random(vUv);

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.14 固定马赛克

将随机数,放到random函数中

varying vec2 vUv;

float random(vec2 st){ // 随机数 ,了解可参考:https://thebookofshaders.com/10/
    return fract(sin(dot(st.xy,vec2(12.9898,78.233))) * 43758.5453123);
}
void main()
{

// patten 24
    vec2 gfidUv = vec2(
        floor(vUv.x * 10.0) / 10.0,
        floor(vUv.y * 10.0) / 10.0
    );
    float strength = random(gfidUv);

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

如何倾斜色块

varying vec2 vUv;

float random(vec2 st){ // 随机数 ,了解可参考:https://thebookofshaders.com/10/
    return fract(sin(dot(st.xy,vec2(12.9898,78.233))) * 43758.5453123);
}
void main()
{

  // patten 25
    vec2 gfidUv = vec2(
        floor(vUv.x * 10.0) / 10.0,
        floor(vUv.y * 10.0 + vUv.x * 5.0) / 10.0 // y根据x变化
    );
    float strength = random(gfidUv);

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.15 角渐变

length(vUv) 获取vUv的长度

varying vec2 vUv;

float random(vec2 st){ // 随机数 ,了解可参考:https://thebookofshaders.com/10/
    return fract(sin(dot(st.xy,vec2(12.9898,78.233))) * 43758.5453123);
}
void main()
{

// patten 26
    float strength = length(vUv);

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

如何更改渐变位置

distance(vUv,vec2(0.5))  获取距离,vUv坐标到其他点的距离  到0.5的距离

      //float strength = length(vUv - 0.5);
      float strength = distance(vUv,vec2(0.5)); // 根据vec2改变中心点位置

    float strength = 1.0 - distance(vUv,vec2(0.5)); // 根据vec2改变中心点位置

    float strength = 0.015/distance(vUv,vec2(0.5)); // 根据vec2改变中心点位置

2.16 x,y轴拉伸,星星,

上面的x轴拉伸

创建vec2 ,设置数值

varying vec2 vUv;

float random(vec2 st){ // 随机数 ,了解可参考:https://thebookofshaders.com/10/
    return fract(sin(dot(st.xy,vec2(12.9898,78.233))) * 43758.5453123);
}
void main()
{
    // patten 30
    vec2 lightUv = vec2(
        vUv.x * 0.1 + 0.45,
        vUv.y * 0.5 + 0.25
    );
    float strength = 0.015/distance(lightUv,vec2(0.5)); // 根据vec2改变中心点位置


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

同时,x,y拉伸,相加

如何倾斜

#define PI 3.1415926535897932384626433832795

varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
 // patten 32  可以旋转uv坐标
    // float pi = 3.1415926535897932384626433832795;
    vec2 rotateUv = rotate(vUv, PI * 0.25 ,vec2(0.5));

    vec2 lightUvX = vec2( rotateUv.x * 0.1 + 0.45, rotateUv.y * 0.5 + 0.25 );
    float lightX = 0.015/distance(lightUvX,vec2(0.5)); 
    vec2 lightUvY = vec2( rotateUv.y * 0.1 + 0.45, rotateUv.x * 0.5 + 0.25 );
    float lightY = 0.015/distance(lightUvY,vec2(0.5));

    float strength = lightX * lightY ;


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.17 中心缺失,渐变,圆圈,不规则环

#define PI 3.1415926535897932384626433832795

varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
// patten 34
    float strength = step(0.25,distance(vUv,vec2(0.5)));


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

    // patten 35
    float strength = abs(distance(vUv,vec2(0.5)) - 0.25);

      // patten 36
    float strength = 1.0 - step(0.01,abs(distance(vUv,vec2(0.5)) - 0.25));

#define PI 3.1415926535897932384626433832795

varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
    // patten 37
    vec2 wavedUv = vec2(
        vUv.x,
        vUv.y + sin(vUv.x * 30.0)*0.1
    );
    float strength = 1.0 - step(0.01,abs(distance(wavedUv,vec2(0.5)) - 0.25));


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

#define PI 3.1415926535897932384626433832795

varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
    // patten 38
    vec2 wavedUv = vec2(
        vUv.x + sin(vUv.y * 30.0)*0.1,
        vUv.y + sin(vUv.x * 30.0)*0.1
    );
    float strength = 1.0 - step(0.01,abs(distance(wavedUv,vec2(0.5)) - 0.25));


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

#define PI 3.1415926535897932384626433832795

varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
    // patten 39
    vec2 wavedUv = vec2(
        vUv.x + sin(vUv.y * 100.0)*0.1,
        vUv.y + sin(vUv.x * 100.0)*0.1
    );
    float strength = 1.0 - step(0.01,abs(distance(wavedUv,vec2(0.5)) - 0.25));


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.18 渐变 弧形

    atan(x) 弧度 反正切函数


varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
    // patten 40
    float angle = atan(vUv.x,vUv.y);
    float strength = angle;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}


varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
      // patten 41
    float angle = atan(vUv.x - 0.5,vUv.y - 0.5);
    float strength = angle;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}


varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
      // patten 42
    float angle = atan(vUv.x - 0.5,vUv.y - 0.5);
    angle /= PI * 2.0;
    angle += 0.5;
    float strength = angle;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}


varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
    // patten 43
    float angle = atan(vUv.x - 0.5,vUv.y - 0.5);
    angle /= (PI * 2.0) ;
    angle += 0.5;
    angle *= 20.0;
    angle = mod(angle,1.0);
    float strength = angle;

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}


varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
     // patten 44
    float angle = atan(vUv.x - 0.5,vUv.y - 0.5);
    angle /= (PI * 2.0) ;
    angle += 0.5;
    float strength = sin(angle * 100.0);

    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}


varying vec2 vUv;

vec2 rotate(vec2 uv,float rotation, vec2 mid){
    return vec2(
        cos(rotation) * (uv.x - mid.x) + sin(rotation) * (uv.y - mid.y) + mid.x,
        cos(rotation) * (uv.y - mid.y) - sin(rotation) * (uv.x - mid.x) + mid.y
    );
}

void main()
{
    // patten 45
    float angle = atan(vUv.x - 0.5,vUv.y - 0.5);
    angle /= (PI * 2.0) ;
    angle += 0.5;
    float sinusoid = sin(angle * 100.0);

    float radius = 0.25 + sinusoid * 0.02;
    float strength = 1.0 - step(0.01,abs(distance(vUv,vec2(0.5)) - radius));


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

2.19 柏林之声

patriciogonzalezvivo (Patricio Gonzalez Vivo) · GitHub

请参考这边

#define PI 3.1415926535897932384626433832795

varying vec2 vUv;

vec4 permute(vec4 x)
{
    return mod(((x*34.0)+1.0)*x, 289.0);
}
vec2 fade(vec2 t)
{
    return t*t*t*(t*(t*6.0-15.0)+10.0);
}


float cnoise(vec2 P) // 柏林之声
{
    vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
    vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
    Pi = mod(Pi, 289.0); // To avoid truncation effects in permutation
    vec4 ix = Pi.xzxz;
    vec4 iy = Pi.yyww;
    vec4 fx = Pf.xzxz;
    vec4 fy = Pf.yyww;
    vec4 i = permute(permute(ix) + iy);
    vec4 gx = 2.0 * fract(i * 0.0243902439) - 1.0; // 1/41 = 0.024...
    vec4 gy = abs(gx) - 0.5;
    vec4 tx = floor(gx + 0.5);
    gx = gx - tx;
    vec2 g00 = vec2(gx.x,gy.x);
    vec2 g10 = vec2(gx.y,gy.y);
    vec2 g01 = vec2(gx.z,gy.z);
    vec2 g11 = vec2(gx.w,gy.w);
    vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11));
    g00 *= norm.x;
    g01 *= norm.y;
    g10 *= norm.z;
    g11 *= norm.w;
    float n00 = dot(g00, vec2(fx.x, fy.x));
    float n10 = dot(g10, vec2(fx.y, fy.y));
    float n01 = dot(g01, vec2(fx.z, fy.z));
    float n11 = dot(g11, vec2(fx.w, fy.w));
    vec2 fade_xy = fade(Pf.xy);
    vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
    float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    return 2.3 * n_xy;
}


void main()
{
    // patten 46
    float strength = cnoise(vUv * 10.0);


    gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}

   // patten 47
    float strength = step(0.0,cnoise(vUv * 10.0)) ;

    // patten 48
    float strength = 1.0 - abs(cnoise(vUv * 10.0));

    float strength = sin(cnoise(vUv * 10.0) * 20.0);
// patten 50
    float strength = step(0.9,sin(cnoise(vUv * 10.0) * 20.0));

3. 着色器颜色设置

   mix(x, y, a) 返回线性混合的x和y,如:x*(1−a)+y*a

   clamp(x, minVal, maxVal) 将x值钳于minVal和maxVal之间,意思就是当x<minVal时返回minVal,当x>maxVal时返回maxVal,当x在minVal和maxVal之间时,返回x

上面黑白都可以换成其他颜色也可以

  strength = clamp(strength,0.0,1.0); 防止色块叠加 颜色过深

#define PI 3.1415926535897932384626433832795

varying vec2 vUv;

vec4 permute(vec4 x)
{
    return mod(((x*34.0)+1.0)*x, 289.0);
}
vec2 fade(vec2 t)
{
    return t*t*t*(t*(t*6.0-15.0)+10.0);
}


float cnoise(vec2 P) // 柏林之声
{
    vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);
    vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);
    Pi = mod(Pi, 289.0); // To avoid truncation effects in permutation
    vec4 ix = Pi.xzxz;
    vec4 iy = Pi.yyww;
    vec4 fx = Pf.xzxz;
    vec4 fy = Pf.yyww;
    vec4 i = permute(permute(ix) + iy);
    vec4 gx = 2.0 * fract(i * 0.0243902439) - 1.0; // 1/41 = 0.024...
    vec4 gy = abs(gx) - 0.5;
    vec4 tx = floor(gx + 0.5);
    gx = gx - tx;
    vec2 g00 = vec2(gx.x,gy.x);
    vec2 g10 = vec2(gx.y,gy.y);
    vec2 g01 = vec2(gx.z,gy.z);
    vec2 g11 = vec2(gx.w,gy.w);
    vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11));
    g00 *= norm.x;
    g01 *= norm.y;
    g10 *= norm.z;
    g11 *= norm.w;
    float n00 = dot(g00, vec2(fx.x, fy.x));
    float n10 = dot(g10, vec2(fx.y, fy.y));
    float n01 = dot(g01, vec2(fx.z, fy.z));
    float n11 = dot(g11, vec2(fx.w, fy.w));
    vec2 fade_xy = fade(Pf.xy);
    vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);
    float n_xy = mix(n_x.x, n_x.y, fade_xy.y);
    return 2.3 * n_xy;
}


void main()
{
    // patten 50
    float strength = step(0.9,sin(cnoise(vUv * 10.0) * 20.0));

    // Clamp the strength
    strength = clamp(strength,0.0,1.0);

    // Colored version
    vec3 blackColor = vec3(0.0);
    vec3 uvColor = vec3(vUv,1.0);
    vec3 mixedColor = mix(blackColor,uvColor,strength);
    gl_FragColor = vec4(mixedColor,1.0);

    // gl_FragColor = vec4(vec3(strength), 1.0); // 黑白渐进色 ,x由于二维坐标左到右,变大,可以利用这一点渐变

    // Black and with version
    // gl_FragColor = vec4(strength,strength,strength, 1.0); 

}


总结

shader一些颜色的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣整理版七:二叉树(待更新)

满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&#xff0c;有2^k-1个节点的二叉树。 完全二叉树&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&am…

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterato…

自动驾驶系列—深入解析自动驾驶车联网技术及其应用场景

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…

Element-ui Select选择器自定义搜索方法

效果图 具体实现 <template><div class"home"><el-selectref"currencySelect"v-model"currency"filterable:spellcheck"false"placeholder"请选择":filter-method"handleCurrencyFilter"change&q…

Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件

一、ClamTk简介 ClamTk 是一个基于 ClamAV 的开源图形用户界面&#xff08;GUI&#xff09;杀毒软件。它使用 GTK2-Perl 脚本构建而成&#xff0c;支持32位与64位操作系统。ClamTk 提供了一个直观的用户界面&#xff0c;使得用户无需深入了解命令行即可完成大部分操作。它具备…

MIT6.5840 Lab 1: MapReduce(6.824)

结果 介绍 在本实验中&#xff0c;您将构建一个MapReduce系统。您将实现一个调用应用程序Map和Reduce函数并处理文件读写的工作进程&#xff0c;以及一个将任务分发给工作进程并处理失败的工作进程的协调进程。您将构建类似于MapReduce论文的东西。&#xff08;注意&#xff1a…

Kafka进阶_1.生产消息

文章目录 一、Controller选举二、生产消息2.1、创建待发送数据2.2、创建生产者对象&#xff0c;发送数据2.3、发送回调2.3.1、异步发送2.3.2、同步发送 2.4、拦截器2.5、序列化器2.6、分区器2.7、消息可靠性2.7.1、acks 02.7.2、acks 1(默认)2.7.3、acks -1或all 2.8、部分重…

SpringBoot多环境配置的实现

前言 开发过程中必然使用到的多环境案例&#xff0c;通过简单的案例分析多环境配置的实现过程。 一、案例 1.1主配置文件 spring:profiles:active: prod server:port: 80801.2多环境配置文件 开发环境 blog:domain: http://localhost:8080测试环境 blog:domain: https:/…

鸿蒙HarmonyOS 地图定位到当前位置 site查询等操作

应用服务Map使用 地图定位 地点查询及导航 周边查询 点位标记定义等 地图定位 前提地图已经能正常显示&#xff0c;若不能显示请大家参考之前的那篇如何显示地图的博文 地图相关的api 位置效果图&#xff1a; module.json5配置权限 "requestPermissions": [{&…

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#x…

Timeline动画「硬切」的问题

1&#xff09;Timeline动画「硬切」的问题 2&#xff09;移动平台纹理压缩格式选择ASTC&#xff0c;美术出图还需遵守POT吗 3&#xff09;如何去掉DOTS Unity.Entities.Graphics创建的BatchRendererGroup的UI相机回调 4&#xff09;Timeline播放动画会产生位移的问题 这是第409…

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目&#xff0c;里面涉及到用java来重构部分vnpy的开源框架&#xff0c;因为是框架的搭建&#xff0c;所以会涉及到像…

【论文阅读】主动推理:作为感知行为的理论

文章目录 主动推理&#xff1a;作为感知行为的理论摘要1.引言2. 主动推理的概念和历史根源3. 主动推理的规范视角—以及它的发展历程 未完待续 主动推理&#xff1a;作为感知行为的理论 Active inference as a theory of sentient behavior 摘要 这篇文章综述了主动推理的历…

React--》如何高效管理前端环境变量:开发与生产环境配置详解

在前端开发中&#xff0c;如何让项目在不同环境下表现得更为灵活与高效&#xff0c;是每个开发者必须面对的挑战&#xff0c;从开发阶段的调试到生产环境的优化&#xff0c;环境变量配置无疑是其中的关键。 env配置文件&#xff1a;通常用于管理项目的环境变量&#xff0c;环境…

【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出

目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…

【AlphaFold3】开源本地的安装及使用

文章目录 安装安装DockerInstalling Docker on Host启用Rootless Docker 安装 GPU 支持安装 NVIDIA 驱动程序安装 NVIDIA 对 Docker 的支持 获取 AlphaFold 3 源代码获取基因数据库获取模型参数构建将运行 AlphaFold 3 的 Docker 容器 参考 AlphaFold3: https://github.com/goo…

[JAVA]MyBatis框架—获取SqlSession对象

SqlSessionFactory作为MyBatis框架的核心接口有三大特性 SqlSessionFactory是MyBatis的核心对象 用于初始化MyBatis&#xff0c;创建SqlSession对象 保证SqlSessionFactory在应用中全局唯一 1.SqlSessionFactory是MyBatis的核心对象 假设我们要查询数据库的用户信息&#x…

ArkTS学习笔记:ArkTS起步

ArkTS是HarmonyOS的主力应用开发语言&#xff0c;基于TypeScript扩展&#xff0c;强化了静态检查和分析&#xff0c;旨在提升程序稳定性和性能。它采用静态类型&#xff0c;禁止运行时改变对象布局&#xff0c;并对UI开发框架能力进行扩展&#xff0c;支持声明式UI描述和自定义…

JAVA 之 JDBC

JDBC概述 基本介绍 1.JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 2.Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 3.JDBC的基本原理[ 重要 ] 4.模拟JDBC com.lmbc.myjdbc…