GLSL 顶点着色器编程:在任何给定时间选择要制作动画的顶点

GLSL vertex shader programming : selecting which vertexes to animate at any given time

我有一个概念性的问题,我无法解决。 我用粒子制作了一张图片,所以我有 50000 个粒子可以制作一张漂亮的照片。 现在我想让波浪穿过图片/粒子。 所有粒子的 x 和 y 坐标都为 z = 0.0,所以 z 值这就是我想要随时间设置动画的值

我有一个基本的顶点着色器代码

precision mediump float;

attribute float uColor;
attribute float uRnd;

uniform float uTime;
uniform float uMouseX;
uniform float uMouseY;
uniform bool uAnimate;

varying float uCol;
varying vec2 vUv;
varying vec2 vMousePos;


void main(){
  uCol = uColor;
  vUv = uv;
  vMousePos = vec2(uMouseX, uMouseY);
  vec3 pos = position;

  vec4 modelPosition = modelMatrix * vec4(pos, 1.0);
  vec4 viewPosition = viewMatrix * modelPosition;
  vec4 projectedPosition = projectionMatrix * viewPosition;
  gl_PointSize = 3.0;
  gl_Position = projectedPosition;
}

问题是我不明白我怎么能在任何给定时间只影响某些独立于其他粒子的粒子。 例如写

vec4 modelPosition = modelMatrix * vec4(pos, 1.0);
   modelposition.z += 100.0 * sin(uTime);
   vec4 viewPosition = viewMatrix * modelPosition;
   vec4 projectedPosition = projectionMatrix * viewPosition;

将在任何给定时间影响每个粒子的 z 位置,从而使整个画面移动。 我说我想要波从左向右流动,所以我必须首先从左侧的粒子开始,然后逐渐移动到右侧。 我需要做什么才能 select 从其余顶点中剔除某些顶点?

2 个选项:

计算 CPU 上的每粒子偏移并将该信息作为附加属性缓冲区传递(即执行与传递法线和 uv 缓冲区时相同的操作),然后在 gpu 上添加偏移。

将您的数学变换定义为函数 f(x, y, t),其中 (x,y) 是粒子的原始位置,t 是当前时间,您的函数(写在着色器上)现在适用对粒子的转换。

例如:

vec3 f(vec2 pos, float t)
{
  return vec3(pos, sin(pos.x + t) + cos(pos.y + t));
}

会让你的粒子随着时间的推移摆动,这可能不是你需要的模式,所以你必须玩弄数学直到你满意为止。