2017-07-06 1 views

Répondre

1

Étant donné que WebGL doit être sécurisé puisqu'il s'exécute dans un navigateur Web, un site ou une annonce aléatoire peut exécuter du code WebGL. Pour être sûr, il doit vérifier que toutes les utilisations ne lisent ou n'écrivent aucune donnée en dehors des limites. Un simple exemple d'entrée appelle le gl.texImage2D avec une grande largeur et hauteur mais un tampon trop petit. Normal C OpenGL lira heureusement passé la fin du tampon mais WebGL ne le fera pas et donnera une erreur. Un exemple de sortie simple appelait gl.readPixels avec un tampon de petite taille pour la largeur et la hauteur données. OpenGL serait juste heureusement trash mémoire passé le tampon. WebGL va générer une erreur. De même, lorsque vous appelez gl.drawElements, vous utilisez un tampon d'index pour accéder aux données d'autres tampons. Si l'un de ces indices est trop grand, il accèderait aux données hors limites. Par exemple, vous avez un tampon sur un attribut qui a 3 sommets mais vous avez un indice de 3. Les seuls indices dans la plage sont 0, 1 et 2. OpenGL ne s'en soucie pas mais WebGL le fait. Donc, pour vous assurer que vous ne pouvez pas faire cela, WebGL doit valider vos indices. En d'autres termes, il doit lire votre ELEMENT_ARRAY_BUFFER et vérifier qu'aucun index ne fait référence à des données hors limites. Pour ce faire, il doit conserver une copie des données dans ELEMENT_ARRAY_BUFFER (puisque OpenGL ES 2.0 ne permet pas de lire les données d'un tampon et même si cela était trop lent). Les copies des données de WebGL dans la mémoire tampon emploient la mémoire ainsi afin de ne pas gaspiller la mémoire seulement les tampons qui sont faits avec ELEMENT_ARRAY_BUFFER ont une copie de leurs données gardées. Les autres tampons n'ont pas besoin d'avoir une copie de leurs données. Pour cette raison, les tampons de 2 types sont incompatibles dans WebGL, vous ne pouvez donc pas lier un à ARRAY_BUFFER et ELEMENT_ARRAY_BUFFER. Pour ce faire, il faudrait les deux types de tampons pour conserver une copie des données.

REMARQUE: Les implémentations WebGL mettent en cache les informations relatives aux indies dans un ELEMENT_ARRAY_BUFFER. Cela signifie que la première fois que vous dessinez avec le tampon pour une plage donnée, WebGL analyse la copie des données pour s'assurer qu'aucun index n'est hors de portée. La prochaine fois que vous dessinez avec le même tampon en utilisant la même plage, si vous n'avez pas modifié de données dans le tampon, WebGL connaît déjà l'index le plus élevé et n'a plus besoin d'analyser le tampon.

+0

Alors, est-il possible de générer des tampons de matrice d'éléments en utilisant le retour de transformée? – jz87

+0

pas directement. vous devrez appeler 'gl.getBufferSubData' pour retirer les données, puis télécharger ces données dans un autre tampon en utilisant' gl.bufferData' ou 'gl.bufferSubData'. Je serais curieux de savoir pourquoi vous voudriez générer un tampon d'index dans un shader. Une technique cool? – gman

+0

Non, c'est juste que j'ai besoin de générer de très gros maillages de terrain, donc ce serait plus rapide de le faire sur le GPU. Je suppose que je peux générer le tableau d'index dans un webworker. J'explorais les alternatives entre utiliser plus d'instances et utiliser des tuiles plus grandes. – jz87