Problème GLSL: Plusieurs shaders dans un programme
Je dois avoir mal compris quelque chose avec des shaders:
Je pense que vous pouvez attacher plusieurs shaders pour un programme, vous serez capable de simplement attacher plus d'un fragment shader, à titre d'exemple: Une caisse de texture rendu avec une couleur de modulation et réfraction.
Mais apparemment ce n'est pas le cas, vous pouvez avoir une seule fonction principale du programme.
- Comment puis-je contourner la fonction principale limite et de permettre à toute dynamique de la combinaison de plusieurs fragment shaders qui sont dans le même programme et a appelé les uns après les autres?
source d'informationauteur Nightshade
Vous devez vous connecter pour publier un commentaire.
Vous pouvez avoir un ensemble de points d'entrée pré-défini. Supposons que vous avez un nombre limité d'effets (diffuse, spéculaire, de l'environnement, etc). Aucun d'eux n'est appliquée qu'une fois au plus, de sorte que vous suffit de créer une gestion de shader comme celui-ci:
Puis, quand il est temps de lier le programme de shaders vous joindre le correspondant implémentations distinctes GLSL objets. Certaines implémentations peuvent être nuls si vous ne voulez pas l'effet. Cette approche ne nécessite pas de texte source de l'analyse et n'a pratiquement aucune perte de performance.
Vous ne pouvez pas. Ceci est connu comme la combinatoires explosion de shaders. Soit vous utilisez massive shaders appelé le Übershader approche - ou je crois que vous pouvez l'atteindre par jouer avec le préprocesseur et la génération de la shaders vous avez besoin à la volée.
Des versions plus récentes de GLSL devrait soutenir les fonctions virtuelles, qui vous permet de construire de façon modulaire comme vous le feriez dans le code de CPU - HLSL5.
Le problème est que les termes que vous utilisez.
Permettez-moi de faire une similitude:
Comme vous pouvez le voir, un programme de shaders est l'exécutable. Il relie plusieurs shader objets. Chaque objet shader est compilé à partir d'une source. Comme d habitude exécutable, il y a un seul point d'entrée principal, qui est définie par un seul objet shader. Tout comme la compilation avec n'importe quel outil de compilation de la chaîne.
La solution est le bon équilibre entre shader combinaisons d'objets et le nombre de shader programmes. Bien sûr, il serait beau d'avoir un seul programme de shaders pour le rendu, mais qui fait semblant de trop: essayez de tenir compte de l'shader fonctionnalités, puis compilés séparément ces fonctionnalités et de lien en tant que de besoin.
Et vous devez avoir un coup d'oeil sur OpenGL Registreje pense que vous pouvez trouver quelque chose d'intéressant dans la liste des extensions.
Vous pouvez avoir plusieurs programmes dans un shader, mais pas l'inverse.
De faire de multiples combinaisons, le plus simple est de stocker chaque grande partie comme un fragment avec un nom de point d'entrée, puis les inclure à partir d'un autre programme ou les combiner à l'exécution en un seul programme, en les appelant dans l'ordre que vous avez besoin. Qui peut être gênant si, lors de la manipulation d'entrée et de sorties.
Vous pouvez utiliser plusieurs passages, avec des effets différents et des programmes dans chaque passage. Qui a une certaine charge supplémentaire, mais peut-être plus facile à mettre en place.