threejs之使用顶点着色器和片着色器生成飞线原理分析

// fragment.glsl
varying float vSize;
uniform vec3 uColor;
void main(){
   
    float distanceToCenter = distance(gl_PointCoord,vec2(0.5,0.5));
    float strength = 1.0 - (distanceToCenter*2.0);
    
    if(vSize<=0.0){
   
        gl_FragColor = vec4(1,0,0,1);;
    }else{
   
        gl_FragColor = vec4(uColor,strength);
    }
    
}

这个一个片段着色器程序,用于在屏幕上绘制点,并根据点的大小和距离中心点的距离调整点的颜色强度:

  1. varying float vSize;:这是一个变量,从顶点着色器传递过来的,用于表示点的大小。

  2. uniform vec3 uColor;:这是一个uniform变量,表示点的颜色。

  3. void main() { ... }:这是片段着色器的入口函数。

  4. float distanceToCenter = distance(gl_PointCoord,vec2(0.5,0.5));:计算当前片段距离点的中心的距离。gl_PointCoord是片段相对于当前绘制的点的坐标,(0.5, 0.5)是点的中心位置。

  5. float strength = 1.0 - (distanceToCenter*2.0);:根据距离中心的距离计算强度,使距离中心越远的片段强度越低。

  6. if (vSize <= 0.0) { ... } else { ... }:根据点的大小判断点是否存在。如果点的大小小于等于0,则直接将颜色设置为固定值,否则根据点的颜色和距离中心的距离计算点的颜色强度。

  7. gl_FragColor = vec4(...);:设置当前片段的颜色。如果点的大小小于等于0,则使用固定颜色,否则使用指定的颜色(uColor)和计算出的强度(strength)。

通常情况下,在GLSL中颜色值的范围是[0, 1]。

// vertex.glsl
attribute float aSize;

uniform float uTime;
uniform vec3 uColor;
uniform float uLength;

varying float vSize;

void main(){
   
    vec4 viewPosition = viewMatrix * modelMatrix *vec4(position,1);
    gl_Position = projectionMatrix * viewPosition;
    vSize = (aSize-uTime);//aSize为0-1000,uTime的值一直增大vSize越来越小,后面的点小于0的直接就不可见了,呈现出水流流出效果
    if(vSize<0.0){
   // 当后面的不可见的时候vSize会小于0,此时让它加上最初的值,变成最开始的长度,让不可见的重新可见
        vSize = vSize + uLength; 
    }
    vSize = (vSize-500.0)*0.1; // 图像往下平移500
    
    gl_PointSize = -vSize/viewPosition.z;
}

这段代码是一个顶点着色器程序,它对顶点进行处理,主要包括对顶点位置的变换和点的大小调整。

  1. attribute float aSize;:这是一个顶点属性,表示每个顶点的大小。

  2. uniform float uTime;:这是一个uniform变量,表示时间。于控制点的大小随时间变化的效果。

  3. uniform vec3 uColor;:这是一个uniform变量,表示点的颜色。

  4. uniform float uLength;:这是一个uniform变量,表示某种长度,用于控制点的大小。

  5. varying float vSize;:这是一个varying变量,用于将顶点着色器计算的点的大小传递给片段着色器。

  6. vec4 viewPosition = viewMatrix * modelMatrix * vec4(position, 1);:将顶点从模型空间变换到视图空间,计算顶点的最终位置。

  7. gl_Position = projectionMatrix * viewPosition;:将顶点的最终位置变换到裁剪空间,以便后续进行投影变换。

  8. vSize = (aSize - uTime);:计算顶点的大小。将顶点的大小减去时间,为了实现随时间变化的效果。

  9. if (vSize < 0.0) { ... }:当后面的不可见的时候vSize会小于0,此时让它加上最初的值,变成最开始的长度,让不可见的重新可见。

  10. vSize = (vSize - 500.0) * 0.1;:对顶点的大小进行调整,为了对顶点的大小进行缩放和平移。

  11. gl_PointSize = -vSize / viewPosition.z;:设置点的大小。根据顶点的深度进行调整,确保点在屏幕上的大小与其在视觉上的大小相符合。
    当uTime为500时有一半飞线是不可见的,此时一半的vSize小于0,我们在顶点着色器中设置了为透明。此时当uTime从0到1000再次回到0时飞线最开始那头会从0突变成最大。正常不是从头开始,而是反过来从尾部开始形成流动的感觉。
    请添加图片描述
    此时把为小于0的部分加上总size的长度,使得小于0的时候变为时间为0的长度。

请添加图片描述

相关推荐

  1. 11.1 OpenGL可编程顶点处理:顶点着色

    2024-02-18 20:56:04       38 阅读
  2. 11.3 OpenGL可编程顶点处理:几何着色

    2024-02-18 20:56:04       35 阅读
  3. 11.2 OpenGL可编程顶点处理:细分着色

    2024-02-18 20:56:04       34 阅读
  4. WebGL使用着色将颜色应用于 WebGL

    2024-02-18 20:56:04       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-18 20:56:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-18 20:56:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-18 20:56:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-18 20:56:04       20 阅读

热门阅读

  1. 面试指导(面试会遇到的问题准备)

    2024-02-18 20:56:04       25 阅读
  2. 红队信息收集&移动安全入门

    2024-02-18 20:56:04       23 阅读
  3. js作用域

    2024-02-18 20:56:04       26 阅读
  4. React -- useState使用方法

    2024-02-18 20:56:04       26 阅读
  5. PTA | Wifi密码

    2024-02-18 20:56:04       29 阅读
  6. 初学者入门机器学习 (ML)的推荐教程

    2024-02-18 20:56:04       31 阅读