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

前言

课程回顾:

        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 相加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值