ThreeJS着色器初体验之平面波动效果

起因

搞了好久的cesium,好久没搞过THREE了,打算重拾一下THREE的内容,加深一下学习。

效果

平面波动+明亮颜色变化

img

Three的着色器

THREE写着色器效果分别是ShaderMaterial和RawShaderMaterial

区别在于

  • ShaderMaterial
    • THREE内置的uniforms和attributes的定义
  • RawShaderMaterial
    • 和原生的一样,需要什么自己写

实现

创建平面

这里需要注意,如果没设置分段数,则默认只有4个顶点,4个顶点的情况下是做不出波动的效果的

// 创建平面
const floor = new THREE.Mesh(
new THREE.PlaneGeometry(1, 1, 64, 64),
rawShaderMaterial
);
scene.add(floor);

创建shader

顶点着色器

顶点坐标的z值根据sin函数通过顶点坐标x值加入频率和振幅进行控制实现波动的效果

      precision lowp float;
      attribute vec3 position;
      attribute vec2 uv;
      
      
      uniform mat4 modelMatrix;
      uniform mat4 viewMatrix;
      uniform mat4 projectionMatrix;
      
      // 获取时间
      uniform float uTime;
      // 频率
      uniform float uFrequency;
      // 振幅
      uniform float uScale;
      
      
      varying vec2 vUv;
      varying float vElevation;
      
      
      void main(){
          vUv = uv;
          vec4 modelPosition = modelMatrix * vec4( position, 1.0 );

          modelPosition.z = sin((modelPosition.y+uTime)  * uFrequency)*uScale ;
          vElevation = modelPosition.z;
      
          gl_Position = projectionMatrix * viewMatrix * modelPosition ;

片元着色器

根据顶点每个位置的高度,实现颜色变化的效果

precision lowp float;
varying vec2 vUv;
varying float vElevation;

uniform sampler2D uTexture; 


void main(){
    // 根据UV,取出对应的颜色
    float height = vElevation + 0.05 * 20.0;
    vec4 textureColor = texture2D(uTexture,vUv);
    textureColor.rgb*=height;
    gl_FragColor = textureColor;
}
posted @ 2023-02-11 23:40  百年内必成大牛  阅读(94)  评论(0编辑  收藏  举报