2017-07-16 4 views
1

Je suis nouveau à webgl. J'essaie de définir un temps uniforme, donc je peux changer la sortie de mon fragment shader au fil du temps. Je pensais que ce serait assez simple à mettre en œuvre, mais je me bats. Je suis conscient que ces deux méthodes sont probablement impliqués:Comment définir un temps uniforme dans webgl

est une sorte de boucle le rendu nécessaire?

Toute aide ici serait vraiment appréciée, merci.

+0

Avez-vous un code? En général, vous pouvez écrire un temps delta dans un vriable uniforme de type 'int' ou' float'. – Rabbid76

+0

@ Rabbid76 merci - voir ma solution actuelle ci-dessous –

+1

[Vous pourriez trouver ces articles utiles] (https://webglfundamentals.org) – gman

Répondre

1

Voici ma solution actuelle ...

Dans mon fichier WebGL JS créer un uniforme de temps, puis définissez chaque cadre d'animation avec une valeur actualisée.

// create time uniform 
var timeLocation = context.getUniformLocation(program, "u_time"); 

function renderLoop(timeStamp) { 

    // set time uniform 
    gl.uniform1f(timeLocation, timeStamp/1000.0); 

    gl.drawArrays(...); 

    // recursive invocation 
    window.requestAnimationFrame(renderLoop); 
} 

// start the loop 
window.requestAnimationFrame(renderLoop); 

Puis dans mon shader fragment:

precision mediump float; 

uniform float u_time; 

void main() { 
    gl_FragColor = vec4(abs(sin(u_time)),0.0,0.0,1.0); 
} 
+0

FYI: 'requestAnimationFrame' passe l'heure au rappel. En d'autres termes, vous n'avez pas besoin de 'var = performance.now()' juste utiliser 'function renderLoop (maintenant) {' – gman

+0

@gman ok oui merci –

+0

vous n'avez pas non plus besoin de 'timeStart'. le temps passé à 'requestAnimationFrame' commence toujours à 0 – gman