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



我有一个概念性的问题,我无法理解。我用粒子做了一张照片,所以我有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位置,从而使整个图片移动。假设我希望波从左向右流动,所以我必须首先从左边的粒子开始,然后逐渐向右移动。我必须做什么才能从其他顶点中选择出某些顶点?

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));
}

会让你的粒子随着时间的推移而摆动,这可能不是你需要的模式,所以你必须反复计算,直到你满意为止。

最新更新