es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    uniform float uThreshold; // define valor umbral
    
    void main() {
      // ...
      if (pos.x > uThreshold) { // aplica la animación de onda si la coordenada x es mayor que el umbral
        modelposition.z += 100.0 * sin(uTime);
      }
      // ...
    }
    

    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.

Comments are closed.