2017-02-03 5 views
0

Dans mon application, je génère des mipmaps pour la texture de la carte de cube 6x4096x4096. Ensuite, je dois effectuer d'autres changements sur cette texture qui dépendent du temps. Tout le dessin est fait dans la boucle de requestAnimationFrame. Selon le navigateur, le périphérique, etc., il faut parfois trois, parfois quatre ou même cinq images consécutives de la boucle pour générer ces mipmaps, et j'ai besoin de savoir dans quelle image exactement les mipmaps sont déjà faits. Donc la question est: comment vérifier dans quelle trame des mipmaps de boucle de requestAnimationFrame générés pour le "TEXTURE_CUBE_MAP" par la commande "generateMipmap" de WebGL sont prêts? Existe-t-il un indicateur pour vérifier l'état de l'achèvement "generateMipmap"?Est-ce que generateMipmap est terminé?

Répondre

1

Il n'y a aucun moyen de savoir quand generateMipmap se terminera ou combien de temps cela prendra. Je serais surpris que cela prenne autant de temps mais si le point est que vous voulez éviter jank une solution serait de faire vos propres mips. De cette façon, vous pouvez les télécharger un seul par visage par image ou même en petits incréments.

Une autre solution possible, mais probablement ne fonctionne que sur Chrome est de deviner juste et attendre quelques images avec le code comme

gl.generateMipmap(...); 
gl.flush(); // make sure the previous command will be executed 

// now do something to wait 4 frames like 
var framesToWait = 4; 
function render() { 
    if (framesToWait) { 
    --framesToWait; 
    } else { 
    ... call drawArrays ... 
    } 
    requestAnimationFrame(render); 
} 
requestAnimationFrame(render); 

Cette pourrait travail parce que le chrome est multi-processus. Je ne suis pas sûr de ce que le point serait cependant.

Dans WebGL2, vous pouvez utiliser un objet FenceSync pour savoir quand quelque chose s'est terminé.

0

generateMipmap est un appel "synchrone". Alors que les navigateurs peuvent essayer de l'optimiser en y retournant immédiatement, avant de générer des niveaux MIP, la première utilisation d'une texture pour laquelle generateMipmap a été appelée s'assurera que les niveaux MIP sont prêts à être utilisés. Pour le mettre dans le code:

const texture = gl.createTexture(); 
gl.activeTexture(gl.TEXTURE0); 
gl.bindTexture(gl.TEXTURE_2D, texture); 
gl.texImage2D(gl.TEXTURE_2D, /* ... */); 
gl.generateMipmap(gl.TEXTURE_2D); 
gl.uniform1i(someSamplerUniform, 0); 
gl.drawArrays(/* ... */); // Here WebGL implementation will make sure that 
          // mip-levels for tetxure are ready. If they aren't, 
          // this call will cause blocking. 

Si vous modifiez le contenu de 0 mip niveau de la texture, vous devez appeler generateMipmap à nouveau.

Here's un peu plus d'informations à propos de ce comportement.

+0

Nous vous remercions de votre réponse. Mon problème n'est pas avec l'ordre des commandes WebGL, mais avec le comportement de boucle de requestAnimationFrame. Disons que j'appelle "generateMipmap" au numéro d'image 0. Alors je voudrais savoir combien d'images seraient nécessaires pour terminer la génération des mipmaps, parce que dans le dernier de ces cadres, je voudrais appeler la fonction "drawArrays" ". Je n'ai pas besoin de connaître le nombre exact d'images à l'avance, juste besoin de vérifier en utilisant une sorte d'instruction "if" quand le travail (générer mipmaps) est fait. –

+0

Il n'y a pas d'API pour ça. De plus, comme je l'ai dit, 'generateMipmap' peut se bloquer jusqu'à ce que ce soit fait. En outre, le matériel de l'utilisateur joue un rôle important ici, il n'y a donc aucun moyen d'obtenir de manière fiable le nombre d'images générant des niveaux MIP. Si vous n'avez pas besoin de régénérer les mipmaps fréquemment, je suggère d'utiliser la texture dans le même cadre (ou peut-être le suivant). Si vous avez besoin de mettre à jour la texture fréquemment, il est judicieux de chercher des moyens d'éviter d'utiliser le mipmap. –

+0

La raison de ce dont j'ai besoin (ce qui peut sembler étrange au premier coup d'œil) est que j'utilise un paramètre de temps t que je passe à l'appel de type "drawArrays". J'ai besoin de savoir quand "generateMipmap" est terminé (dans quel cadre), donc je pourrais passer "drawArrays (t)" à la bonne valeur de t (je mesure la durée de chaque image de la boucle de requestAnimationFrame). –