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?
Réponses:
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:
Les inconvénients:
Uber-shader
Avantages:
Les inconvénients:
la source
Uber-shader
dans 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#ifdef
s qui seront basculés pour différents matériaux.