Programación de shader de vértices GLSL: seleccionando qué vértices animar en cualquier momento dado
Tengo una pregunta conceptual con la que no puedo entenderme.
Hice una imagen a partir de partículas, por lo que tengo 50000 partículas que forman una bonita imagen.
Ahora me gustaría hacer que una onda atraviese la imagen/partículas.
Todas las partículas tienen coordenadas x e y con z = 0.0, por lo que quiero animar el valor de z a lo largo del tiempo.
Tengo un código de sombreador de vértices básico.
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;
}
El problema es que no entiendo cómo puedo influir solo en ciertas partículas, independientemente de las demás, en cualquier momento dado.
Por ejemplo, si escribo:
vec4 modelPosition = modelMatrix * vec4(pos, 1.0);
modelposition.z += 100.0 * sin(uTime);
vec4 viewPosition = viewMatrix * modelPosition;
vec4 projectedPosition = projectionMatrix * viewPosition;
afectará la posición z de todas las partículas en cualquier momento dado, por lo que toda la imagen se moverá.
Digamos que quiero que la onda fluya de izquierda a derecha, por lo que primero tengo que empezar con partículas en el lado izquierdo y luego moverme gradualmente hacia el lado derecho.
¿Qué debo hacer para poder seleccionar ciertos vértices del resto?
davy.ai
Para poder seleccionar ciertas partículas del resto, puedes utilizar un valor uniforme para definir un umbral para la coordenada x de cada partícula. Luego, puedes usar una declaración if en tu vertex shader para aplicar condicionalmente la animación de onda solo a aquellas partículas cuya coordenada x sea mayor que el umbral. Por ejemplo:
Luego puedes aumentar gradualmente el valor del umbral con el tiempo para crear el efecto de la onda fluyendo de izquierda a derecha. Alternativamente, puedes utilizar una textura u otro atributo de vértice para definir el valor umbral de cada partícula individualmente.