2013-07-24 1 views
2

Considérons une telle situation. La scène contient des objets donnés: ABCDERendu de l'avant vers l'arrière vs échange des shaders

Si l'ordre de la caméra (de la plus proche au plus éloigné) AEBDC

et des objets AC utilisation shader1, shaders ED 2, B shader3

objets AC utiliser shader dommage mais texture différente.

Maintenant, quoi faire face à une telle situation?

  • rendu tout d'avant en arrière (5 swap)
  • Rendu par groupe de nuançage qui sont triés (3 swaps shaders). Marquer tous les programmes de shader sur un (1 échange).

Est-ce que des instructions comme glUniform, etc. glBindTexture pour changer la valeur dans déjà dans le programme d'utilisation frais généraux de cause?

Répondre

4

Il n'y a pas une seule réponse à cette question. Est-ce que l'évolution de l'état OpenGL "provoque des frais généraux"? Bien sûr ils le font; Rien n'est gratuit. La question est de savoir si le surcoût causé par un changement d'état sera pire que le support de test de profondeur moins efficace. Cela ne peut pas être répondu, car la réponse dépend de combien il y a de surdéveloppement, combien coûtent vos fragments de fragment, combien de changements d'état une séquence particulière d'appels de tirage nécessitera, et de nombreux autres intangibles qui ne peuvent pas être connus auparavant.

C'est pourquoi le profilage avant optimisation est important.

1

profil, profil et encore plus le profil :)

je voudrais ajouter une chose cependant:

Dans votre situation, vous pouvez utiliser idée d'une file d'attente de rendu. C'est une sorte de gestionnaire pour dessiner des objets. Au lieu de dessiner un objet, vous appelez renderQueue.add(myObject). Ensuite, lorsque vous add() tous les objets nécessaires, vous pouvez appeler renderQueue.renderAll(). Cette méthode peut gérer tout le tri (par la distance, par le shader, par le matériel, etc.) et de cette façon cela peut être plus utile lors du profilage (et ensuite changer la façon dont vous effectuez le rendu).

Bien sûr, ce n'est qu'une idée approximative.