Gl.LinkProgram (gb.opengl.glsl)
Static Sub LinkProgram ( Program As Integer )
Lie un programme objet
Paramètres
- program
-
Spécifie le gestionnaire de l’ objet programme à lier.
Description
Gl.LinkProgram lie l’objet programme spécifié par
Program. Si des objets shader de type Gl.VERTEX_SHADER sont rattachés à
Program, ils seront utilisés pour créer un exécutable qui tournera sur le processeur de sommets programmable. Si des objets shader de type Gl.GEOMETRY_SHADER sont rattachés à
Program, ils seront utilisés pour créer un exécutable qui tournera sur le processeur de géométrie programmable.
Si des objets shader de type Gl.FRAGMENT_SHADER sont rattachés à
Program, ils seront utilisés pour créer un exécutable qui tournera sur le processeur de fragments.
L’état de l’opération de liaison sera enregistré comme partie de l’état du programme objet. Cette valeur sera positionnée à Gl.TRUE si le programme objet a été lié sans erreur et prêt à être utilisé, et Gl.FALSE dans le cas contraire. Il peut être interrogé par appel à Gl.GetProgram
avec les arguments
program et Gl.LINK_STATUS.
En résultat d’une opération de liaison réussie, toute variable uniform active définie par l’utilisateur appartenant à
program sera initialisée à 0, et à chaque variable uniform active de programme objet actif sera assigné un emplacement qui peut être interrogé par appel à
Gl.GetUniformLocation. De même, toute variable attribut active définie par l’utilisateur qui n’a pas été reliée à un index d’attribut de sommet générique sera reliée à cet instant.
La liaison d’un programme objet peut échouer pour nombre de raisons comme spécifié dans les
spécifications du langage OpenGL Shading . Ci-dessous la liste des conditions qui entraîneront une erreur de liaison :
-
Le nombre de variables attribut actives géré par l’implémentation a été dépassé.
-
La limite de stockage des variables uniform a été dépassée.
-
Le nombre de variables uniform actives géré par l’implémentation a été dépassé.
-
La fonction main pour le shader de sommets, de fragments ou de géométrie est manquante.
-
Une variable non constante actuellement utilisée dans le reflet de fragments n’est pas déclarée de la même manière (ou n’est pas déclarée du tout) dans le shader de sommets ou de géométrie si présent.
-
Une référence a un nom de fonction ou de variable n’est pas résolue.
-
Une global partagée est déclarée avec deux types différents ou deux valeurs initiales différentes.
-
Un objet reflet attaché, ou plus, n’a pas été compilé avec succès.
-
Le rattachement d’une matrice attribut générique conduit à ce que des rangées de la matrice tombent en dehors du maximum autorisé pour Gl.MAX_VERTEX_ATTRIBS.
-
Il ne peut être trouvé suffisamment d’attributs de connexions de sommets contigus pour se rattacher aux matrices attribut.
-
L’ objet programme contient des objets pour former un shader de fragment mais ne contient pas d’objet pour former un shader de sommet.
-
L’ objet programme contient des objets pour constituer un shader de géométrie
mais ne contient pas d’objet pour former un shader de sommet.
-
L’ objet programme contient des objets pour constituer un shader de géométrie
et le type de la primitive d’ entrée, le type de la primitive de sortie, ou le maximum de sommets en sortie n’est spécifié dans aucun objet shader de geometrie.
-
L’ objet programme contient des objets pour constituer un shader de géométrie
et le type de la primitive d’ entrée, le type de la primitive de sortie, ou le décompte maximum de sommets en sortie est spécifié différemment dans de multiples objets shader de géométrie.
-
Le nombre de sorties actives du shader de fragment est plus grand que la valeur de Gl.MAX_DRAW_BUFFERS.
-
Le programme a une sortie active assignée à un emplacement égal ou plus grand que la valeur de Gl.MAX_DUAL_SOURCE_DRAW_BUFFERS
Et possède une sortie active assignée à un indice plus grand ou égal à un.
-
Plus d’une variable de sortie liée à un même numéro et indice.
-
Les assignations de lien explicites n’ont pas assez de place pour que le linker
assigne automatiquement un emplacement pour un tableau variable en sortie, requerrant des emplacements contigus multiples.
-
Le count spécifié par Gl.TransformFeedbackVaryings n’est pas nul, mais l’objet programme n’a pas de shader sommet ou géométrie.
-
Un nom de variable spécifié à Gl.TransformFeedbackVaryings dans le tableau varyings n’est pas déclaré comme sortie dans le shader de sommet (ou de geometrie, si activé).
-
Deux entrées du tableau varyings transmis à Gl.TransformFeedbackVaryings
Specifient la même variable.
-
Le nombre total de composantes à capturer dans une variable de feedback de transformation est plus grand que la constante Gl.MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS
Et le mode du tampon est SEPARATE_ATTRIBS.
Quand un programme objet a été lié avec succès, le programme objet peut faire partie de l’état courant via l’appel à Glu.seProgram. Que l’opération de liaison ait réussi ou non, le log d’information du programme sera réécrit. le log d’information peut être extrait par
Gl.GetProgramInfoLog.
Gl.LinkProgram installera également les exécutables générés comme parties de l’état de rendu courant si l’opération de liaison a été couronnée de succès et que le programme objet spécifié est déjà en cours d’utilisation en tant que résultat d’un précédent appel à
Gl.useProgram.
Si l’objet programme en cours d’utilisation échoue dans une nouvelle liaison, son état de liaison sera positionné à Gl.FALSE , mais les exécutables et les états associés continueront à faire partie de l’état courant jusqu’à ce qu’un appel subséquent à
Gluse.Program le retire. Une fois retiré, il ne peut plus faire partie de de l’état en cours tant qu’il n’a pas été à nouveau lié avec succès.
Si
program contient des objets shader de type Gl.VERTEX_SHADER , et optionnellement de type Gl.GEOMETRY_SHADER,
mais ne contient pas d’objet shader de type Gl.FRAGMENT_SHADER, l’exécutable de shader de sommets sera installé dans le processeur programmable de sommet, l’exécutable de shader de géométrie, si présent, sera installé dans le processeur dans le processeur programmable de géométrie, mais aucun exécutable ne sera installé dans le processeur de fragment. Le résultat des primitives de rasterisation avec un tel programme sera indéterminé.
Le log d’information de l’ objet programme est mis à jour et le programme est généré au moment de l’opération de liaison. Après l’opération de liaison, les applications peuvent modifier les objets shader attachés, les compiler, les détacher, et attacher d’autres objets shader. Aucune de ces opérations n’affecte le log d’information du programme qui fait partie du programme objet.
Notes
Si l’opération de liaison échoue, toute information concernant une précédente opération de liaison sur
program est perdue (c.a.d. une liaison infructueuse ne restaure pas l’état antérieur de
program). Certaines informations de
program peuvent encore être récupérées même après une opération de liaison infructueuse. Voir, en l’occurrence, Gl.GetActiveAttrib et Gl.GetActiveUniform.
Erreurs
Gl.INVALID_VALUE est généré si
Program n’est pas une valeur générée par OpenGL.
Gl.INVALID_OPERATION est généré si
Program n’est pas un programme objet.
Gl.INVALID_OPERATION est généré si
Program est l’obet programme actuellement actif et que le mode de feedback de transformation est actif.
Gets Associés
Gl.Get avec l’argument Gl.CURRENT_PROGRAM
Gl.GetActiveAttrib avec l’argument
program et l’index d’une variable attribut active.
Gl.GetActiveUniform avec l’argument
program et l’indice d’une variable uniform active_
Gl.GetAttachedShaders avec l’argument _ program
Gl.GetAttribLocation avec l’argument _ program_ et le nom d’une variable attribut
Gl.GetProgram avec l’argument _ program_ et and Gl.LINK_STATUS
Gl.GetProgramInfoLog avec l’argument _ program
Gl.GetUniform avec l’argument
program et l’emplacement d’une variable uniform
Gl.GetUniformLocation avec l’argument
program et le nom d’une variable uniform
Gl.IsProgram
Voir aussi
Glu.niform,
Glu.seProgram,
Voir documentation originale sur le site OpenGL