GLSL, tout dans un ou plusieurs programmes de shader?

17

Je fais des démos 3D en utilisant OpenGL et j'ai remarqué que GLSL est quelque peu "limité" (ou est-ce juste moi?). Quoi qu'il en soit, j'ai différents types de matériaux. Certains matériaux ont une couleur ambiante et diffuse, certains matériaux ont une carte d'occlusion ambiante, certains ont une carte spéculaire et une carte de relief, etc.

Est-il préférable de tout prendre en charge dans une paire de vertex / fragment shader ou est-il préférable de créer de nombreux vertex / fragment shaders et de les sélectionner en fonction du matériau actuellement sélectionné? Quelle est la stratégie de shader habituelle dans OpenGL ou D3D?

stjepano
la source
2
voir stackoverflow.com/questions/4649801/…
Patryk Czachurski
Il s'agit d'une fausse dichotomie, selon laquelle vous devez choisir l'une ou l'autre approche pour gérer les shaders. En quinze ans dans l'industrie, je n'ai jamais travaillé sur un projet où nous avons adhéré à l'un ou l'autre extrême, mais j'ai toujours trouvé un équilibre entre les deux approches de la gestion des shaders, en utilisant chacune là où cela avait du sens.
Trevor Powell

Réponses:

12

La réponse est, cela dépend un peu.

Fondamentalement, il existe deux écoles de pensée; petits shaders optimaux pour tout et le camp des uber-shaders.

Les petits shaders ne sont que cela; faire une chose et bien le faire. Les Uber-shaders contrôlent leurs fonctionnalités au moment de l'exécution via des uniformes, ou compilent en un tas de shaders différents via des macros de préprocesseur (et / ou des sources de shaders générées).

La solution optimale n'est probablement ni l'un ni l'autre, mais une sorte d'hybride. Peut-être quelques uber-shaders ou uber-shaders combinés avec des shaders spécialisés dans certains cas.

Petit shader

Avantages:

  • Probablement plus rapide / plus optimal
  • Fait exactement ce que vous voulez qu'il fasse
  • Peut faire des trucs étranges et personnalisés facilement

Les inconvénients:

  • Devient facilement incontrôlable, surtout lorsque le nombre de fonctionnalités augmente
  • Probablement plus de travail, sauf si vous avez un très petit nombre de shaders

Uber-shader

Avantages:

  • Tout en un seul endroit
  • Plus convivial pour les artistes (utiliser la fonctionnalité A avec la fonctionnalité X pour la première fois ne nécessite pas nécessairement de temps de codage)

Les inconvénients:

  • Temps de compilation des shaders plus longs
  • Résultats moins optimaux (en particulier si des uniformes sont utilisés pour activer / désactiver les fonctionnalités)
  • Peut être plus difficile à déboguer / optimiser
Jari Komppa
la source
Uber-shaderdans cette représentation n'est pas une bonne chose :) Je proposerais d'écrire un bon gestionnaire de shaders basé sur des prédéfinis - nous aurons donc du code uber-shader avec beaucoup de #ifdefs qui seront basculés pour différents matériaux.
brigadir
2
J'ajouterais qu'un autre avantage d'un uber-shader est que le changement de shaders a un coût en termes de performances, donc si vous changez moins souvent, vous pourrez peut-être améliorer les performances.
Jherico