Comment puis-je obtenir la couleur d'un fragment?
Je suis d'essayer d'envelopper ma tête autour de shaders en GLSL, et j'ai trouvé quelques ressources utiles et des tutoriels, mais je continue à courir dans un mur pour une chose qui devrait être fondamental et trivial: comment mon fragment shader récupérer la couleur de la fragment?
Vous définissez la couleur finale en disant gl_FragColor = whatever
, mais apparemment, c'est une sortie seule valeur. Comment voulez-vous obtenir la couleur d'origine de l'entrée de sorte que vous pouvez effectuer des calculs sur elle? Qui a obtenu d'être dans une variable quelque part, mais si jamais quelqu'un sait son nom, ils ne semblent pas avoir enregistré dans n'importe quel tutoriel ou de la documentation que j'ai rencontré jusqu'à présent, et il me conduit dans le mur.
- "Couleur d'origine de l'entrée" : entendez-vous les propriétés du matériau affecté à votre fragment (texture, diffusecolor..) ?
Vous devez vous connecter pour publier un commentaire.
Le fragment shader reçoit
gl_Color
etgl_SecondaryColor
que vertex attributs. Il permet aussi de quatre variables variables:gl_FrontColor
,gl_FrontSecondaryColor
,gl_BackColor
, etgl_BackSecondaryColor
qu'il peut écrire des valeurs. Si vous souhaitez passer les couleurs de l'original tout droit à travers, vous feriez quelque chose comme:Fixe fonctionnalité dans le pipeline suivant le vertex shader sera alors de serrage à l'intervalle [0..1], et à voir si le sommet est face à l'avant ou à l'arrière-face. Il sera ensuite interpoler les choisi (avant ou arrière) de la couleur comme d'habitude. Le fragment shader recevrez ensuite choisi, serré, de couleurs interpolées comme
gl_Color
etgl_SecondaryColor
.Par exemple, si vous avez tiré la norme "triangle de la mort" comme:
Puis un vertex shader, comme ceci:
avec un fragment shader comme ceci:
transmettra les couleurs à travers, comme si vous étiez à l'aide de la fonctionnalité de pipeline.
Si vous voulez faire mult passe-rendu, c'est à dire si vous avez rendu à la mémoire de trame et souhaitez pour une deuxième passe de rendu lorsque vous utilisez la précédente rendu que la réponse est:
Shader code 3.2:
L'autre des méthodes de traitement d'une image de rendu serait OpenCL avec OpenGL -> OpenCL interop. Cela permet de plus de CPU comme computationing.
Si ce que vous appelez "valeur actuelle du fragment" est la couleur des pixels de la valeur qui était la cible de rendu avant votre fragment shader s'exécute, alors non, il n'est pas disponible.
La principale raison pour cela est que, potentiellement, au moment de votre fragment shader s'exécute, il n'est pas encore connu. Les Fragment shaders exécuter en parallèle, ce qui pourrait (selon le matériel) qui influent sur le même pixel, et un bloc séparé, de la lecture à partir d'un type de FIFO, est habituellement responsable de fusionner ensemble plus tard. Que la fusion est appelé "Mélange", et ne fait pas partie du pipeline programmable encore. C'est corrigé, mais il présente un certain nombre de différentes façons de combiner ce que votre fragment shader généré avec la précédente valeur de couleur du pixel.
Vous avez besoin d'un échantillon de texture au pixel de coordonnées, quelque chose comme cela
Note,- comme je l'ai vu texture2D est déprécié en GLSL 4.00 spécification - il suffit de regarder pour les texture similaire... fetch fonctions.
Parfois aussi il est préférable de fournir vos coordonnées en pixels au lieu de gl_TexCoord[0].xy - dans ce cas, écrire vertex shader quelque chose comme:
Et dans le fragment shader utiliser que texCoord variable au lieu de gl_TexCoord[0].xy.
Bonne chance.
L'ensemble de votre fragment shader est de décider ce que la sortie de la couleur. La façon de le faire dépend de ce que vous essayez de faire.
Vous pouvez choisir de mettre les choses en place, de sorte que vous obtenez une couleur interpolée basé sur la sortie du vertex shader, mais une approche plus commune serait d'effectuer une texture de recherche dans le fragment shader à l'aide des coordonnées de texture passé dans le vertex shader pour les interpolants. Vous pouvez alors modifier le résultat de votre texture de recherche en fonction de votre choix de l'éclairage des calculs, et de tout votre shader sont censés faire, et puis les écrire dans gl_FragColor.
Le GPU pipeline a accès à la sous-jacentes pixel info immédiatement après les shaders exécuter. Si votre matériel est transparent, l'assemblage de la canalisation sera de combiner tous les fragments.
Généralement les objets sont mélangés dans l'ordre dans lequel ils sont ajoutés à une scène, à moins qu'ils ont été commandés par un z-buffer algo. Vous devriez ajouter des objets opaques en premier, puis ajouter délicatement vos objets transparents dans l'ordre pour être mélangés.
Par exemple, si vous voulez une PALETTE de superposition sur votre scène, vous devez simplement créer un écran de quad objet avec une texture transparente, et les ajouter à votre scène dernière.
Réglage de la SRC et DST mélange de fonctions pour les objets transparents vous donne accès à la précédente mélange de beaucoup de manières différentes.
Vous pouvez utiliser la propriété alpha de votre sortie de couleur, ici pour faire de la fantaisie de fusion. C'est le moyen le plus efficace pour accéder à framebuffer sorties (pixels), car il fonctionne en un seul passage (Fig. 1) de la GPU de pipeline.
Fig. 1 - Seul Passage
Si vous avez vraiment besoin multi pass (Fig. 2), alors vous devez cibler le framebuffer sorties à l'unité de texture plutôt que l'écran, et copie de cette cible de la texture à la passe suivante, et ainsi de suite, le ciblage de l'écran dans la dernière passe. Chaque pass nécessite au moins deux changements de contexte.
Le supplément de la copie et de la commutation de contexte va dégrader les performances de rendu gravement. Notez que le multi-thread GPU pipelines ne sont pas beaucoup d'aide ici, car multi pass est intrinsèquement sérialisé.
Fig. 2 - Multi Pass
J'ai recours à une description verbale du pipeline diagrammes d'éviter la dépréciation, depuis le langage de shader (Argot/GLSL) est sujette à changement.
how-do-i-obtenir-le-actuel-couleur-de-un-fragment
Certains disent qu'il ne peut pas être fait, mais je dis ce qui fonctionne pour moi:
Après l'appel, gl_FragColor sera égal à la couleur de la mémoire tampon de couleur claire la première fois le shader s'exécute sur chaque pixel, et la sortie de chaque course sera la nouvelle entrée sur chaque course.
Bien, au moins ça marche pour moi.