风场可视化:绘制粒子


引子
  • 绘制地图粒子
  • 绘制风粒子
    • 颜色数据
    • 顶点数据和状态数据
    • 顶点着色器
    • 片元着色器
    • 绘制
  • 小结
  • 参考资料
  • 风场数据之后,接着去看如何绘制粒子。

    • 源库:webgl-wind

    • Origin

    • My GitHub

    这里。

    示例。

    先理一下实现的主要思路:

    • 风速映射到像素颜色编码的 R 和 G 分量,由此生成了图片 W 。
    • 创建显示用的颜色数据,并存放到纹理 T1 中。
    • 根据粒子数,创建存储粒子索引的数据并缓冲。还创建每个粒子相关信息的数据,并存放到纹理 T2 中。
    • 加载图片 W 并将图片数据存放到纹理 T3 中。
    • 顶点着色器处理的时候,会根据粒子索引从纹理 T2 中获取对应数据,进行转换会生成一个位置 P 传递给片元着色器。
    • 片元着色器根据位置 P 从图片纹理 T3 中得到数据并进行线性混合得到一个值 N ,根据 N 在颜色纹理 T1 中得到对应的颜色。

    下面就看看具体的实现。

    Back to top

    这里。

    v_particle_pos=vec2(
            color.r / 255.0 + color.b,
            color.g / 255.0 + color.a);
    

    源码注释说“从像素的 RGBA 值解码当前粒子位置”,结合前面数据来看,这样的计算方式得到分量理论范围是 [0, 256/255] ,。变量 v_particle_pos 会在片元着色器中用到。

    gl_Position = vec4(2.0 * v_particle_pos.x - 1.0, 1.0 - 2.0 * v_particle_pos.y, 0, 1);
    

    gl_Position 变量是顶点转换到裁剪空间中的坐标值,裁减空间范围 [-1.0, +1.0] ,想要显示就必须要在这个范围内,这里的计算方式达到了这个目的。

    示例。

    Back to top

    Back to top

    How I built a wind map with WebGL