Ma scène contient plusieurs objets. (Disons 3 cubes, 1 cylindre, 8 sphères.) Je suppose que je devrais créer un vertex shader pour chacun. Combien de programmes dois-je avoir?
Alternatives:
- Un programme par objet
- Un programme pour tous les cubes et un autre pour toutes les sphères (en supposant qu'ils utilisent les mêmes shaders)
- Un grand programme pour tout
Quelle est la bonne approche?
opengl
shaders
architecture
Jacks_Gulch
la source
la source
Réponses:
Vous devriez considérer les programmes de shader comme une partie similaire de l'état comme les textures. Changer l'état coûte cher, vous pouvez donc vous en sortir en combinant plusieurs textures en une seule pour éviter les changements de texture; il en va de même pour les shaders - vous pouvez combiner plusieurs shaders pour éviter les changements d'état.
De la même manière que la combinaison de textures, la combinaison de shaders s'accompagne d'un surcoût - si vous ne rendez que 16 x 16 pixels sur une texture 4096 x 4096, vous n'utilisez pas le matériel efficacement. De même, si l'objet que vous restituez n'utilise que 10% du code dans votre shader, il est possible (et même probable) que la carte graphique calcule beaucoup de choses inutilement.
En bref, "dépend".
la source
Il vaut mieux garder les choses aussi simples que possible. Dupliquer le même shader pour chaque objet n'est pas nécessaire et se gonflera rapidement. Vous ne voulez pas non plus d'un shader géant qui couvre tous les cas d'utilisation possibles, car cela entraîne des frais généraux inutiles.
Il existe plusieurs opinions sur la gestion des shaders et aucune manière "optimale" de l'aborder. J'ai même vu des implémentations de shaders où chaque shader est généré à la volée en fonction de paramètres (par exemple dans le moteur Unreal ).
Pour quelqu'un qui débute dans ce domaine, il peut être bon de commencer par dessiner les shaders de base. Par exemple, j'ai un shader pour les objets sans texture, un shader avec une texture de base et un support d'éclairage par pixel, etc ... Ensuite, chaque fois que je veux un effet différent qui ne peut pas être fait en utilisant un shader précédent, alors je ' ll en créer un nouveau pour le nouvel effet.
Le but d'un tel système est de garder les choses simples. Juste. Garder. Il. Facile.
la source