Combien de programmes OpenGL dois-je utiliser pour rendre plusieurs objets?

10

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?

Jacks_Gulch
la source
1
"Je suppose que je devrais créer un vertex shader pour chacun." Pourquoi supposez-vous cela? Un vertex shader transformera les sommets selon votre modèle et affichera les matrices et vous voudrez presque toujours qu'il en soit de même pour tout.
usm

Réponses:

8

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".

Jari Komppa
la source
4
De plus, dans de nombreux cas, vous pouvez vous en tirer avec un seul shader. Les différences ne concernent que les uniformes que vous passez au shader, comme la couleur, la texture, les cartes normales, etc.
rioki
Ouais, par exemple, vous pourriez avoir un shader "Scaly" qui produit des fragments qui ont l'air squameux, et qui fonctionne de telle manière (la plupart des shaders le font ...) que vous pouvez rendre les 3 cubes, 1 cylindre et 8 sphères en utilisant cela un shader (avec les primitives de géométrie correspondantes, bien sûr). Un ensemble raisonnable d'uniformes ici pourrait être une valeur vectorielle définissant la couleur, et peut-être quelques scalaires ou quelque chose qui affecte la façon dont "visuellement" ou "brillant" l'effet visuel sera. Ensuite, vous avez un shader et vous changez la façon dont les couleurs du shader se fragmentent en changeant les uniformes entre les tirages des géométries individuelles.
Steven Lu
5

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.

Anko
la source
+1 parce que vous avez mentionné ce que fait l'industrie actuelle.
Krythic