Lignes directrices pour l'optimisation des performances de WebGL en limitant les changements de shaders / état

StackOverflow https://stackoverflow.com/questions/4520768

Question

Je suis en train de se faire une idée de l'aspect pratique de WebGL pour le rendu des scènes d'intérieur grandes, composé de 100K de triangles. Ces triangles sont répartis sur de nombreux objets, et il y a beaucoup de matériaux dans la scène. D'autre part, il n'y a pas de pièces mobiles. Et les matériaux ont tendance à être assez simple, la plupart du temps basé sur des cartes de texture. Il y a beaucoup de partage de carte de texture .. par exemple toutes les chaises en scène partageront une carte commune. Il y a aussi quelques multitexturing -. Jusqu'à trois textures superposées dans un matériau

Je fais un peu d'expérimentation et de la lecture, et déduis que les matériaux de commutation fréquemment au cours d'une passe de rendu va ralentir les choses. Par exemple, une scène avec 200K triangles aura des différences significatives de performance, selon que il y a 10 ou 1000 objets, en supposant que chaque fois qu'un objet est affiché un nouveau matériau est mis en place.

Il semble donc que si la performance est importante la scène doit être triée par des matériaux de manière à minimiser la commutation matérielle. Ce que je suis à la recherche est des lignes directrices sur la façon de penser à la tête de divers changements d'état, et où puis-je obtenir le meilleur rendement pour l'argent. Par exemple,

  • quels sont les coûts de performance relatifs de, disons, gl.useProgram(), gl.uniformMatrix4fv(), gl.drawElements()
  • que je devrais essayer d'écrire ubershaders pour minimiser commutation shaders?
  • que je devrais essayer de la géométrie globale pour réduire au minimum le nombre d'appels de gl.drawElements()

Je me rends compte que le kilométrage peut varier selon le navigateur, OS et matériel graphique. Et je suis à la recherche pas non plus des mesures héroïques. Juste quelques lignes directrices de personnes qui ont déjà eu une certaine expérience dans la fabrication des scènes rapides. Je vais ajouter que pendant que j'ai eu une certaine expérience avec la programmation OpenGL pipeline fixe dans le passé, je suis assez nouveau à la façon dont WebGL / OpenGL ES 2.0 de faire les choses.

scroll top