J'ai lu quelques tutoriels sur le Cg, mais une chose n'est pas tout à fait claire pour moi. Quelle est exactement la différence entre les vertex et fragment shaders? Et pour quelles situations l’un est-il plus adapté que l’autre?
Un fragment shader est identique à pixel shader.
Une différence principale est qu'un vertex shader peut manipuler les attributs des sommets. qui sont les points de coin de vos polygones.
Le fragment shader, quant à lui, prend en compte l'aspect des pixels entre les sommets. Ils sont interpolés entre les sommets définis selon des règles spécifiques.
Par exemple: si vous souhaitez que votre polygone soit complètement rouge, vous définissez tous les sommets en rouge. Si vous voulez des effets spécifiques comme un dégradé entre les sommets, vous devez le faire dans le fragment shader.
En d'autres termes:
Le vertex shader fait partie des premières étapes du pipeline graphique, quelque part entre la transformation des coordonnées du modèle et le découpage des polygones, je pense. A ce stade, rien n'est encore vraiment fait.
Cependant, le fragment/pixel shader fait partie de l'étape de rastérisation, où l'image est calculée et les pixels entre les sommets sont remplis ou "colorés".
Il suffit de lire sur le pipeline graphique ici et tout se révélera: http://en.wikipedia.org/wiki/Graphics_pipeline
Le vertex shader se fait sur chaque sommet, alors que fragment shader se fait sur chaque pixel. Le fragment shader est appliqué après le vertex shader. En savoir plus sur le pipeline GPU des shaders texte du lien
La transformation de sommet est la première étape de traitement du pipeline matériel graphique. La transformation de sommet effectue une séquence d'opérations mathématiques sur chaque sommet. Ces opérations incluent la transformation de la position du sommet en une position d'écran à utiliser par le rastériseur, la génération de coordonnées de texture pour la texturation et l'éclairage du sommet pour déterminer sa couleur.
Les résultats de la rastérisation sont un ensemble d'emplacements de pixels ainsi qu'un ensemble de fragments. Il n'y a pas de relation entre le nombre de sommets d'une primitive et le nombre de fragments générés lors de la pixellisation. Par exemple, un triangle composé de trois sommets seulement pourrait occuper tout l’écran et générer des millions de fragments!
Un peu plus tôt, nous vous avions dit de considérer un fragment comme un pixel si vous ne saviez pas exactement ce qu’est un fragment. À ce stade, cependant, la distinction entre un fragment et un pixel devient importante. Le terme pixel est l'abréviation de "picture element". Un pixel représente le contenu du tampon d'images à un emplacement spécifique, tel que la couleur, la profondeur et toute autre valeur associée à cet emplacement. Un fragment est l'état requis potentiellement pour mettre à jour un pixel particulier.
Le terme "fragment" est utilisé parce que la pixellisation divise chaque primitive géométrique, telle qu'un triangle, en fragments de la taille d'un pixel pour chaque pixel recouvert par la primitive. Un fragment a un emplacement de pixel associé, une valeur de profondeur et un ensemble de paramètres interpolés, tels qu'une couleur, une couleur secondaire (spéculaire) et un ou plusieurs ensembles de coordonnées de texture. Ces divers paramètres interpolés sont dérivés des sommets transformés qui constituent la primitive géométrique particulière utilisée pour générer les fragments. Vous pouvez considérer un fragment comme un "pixel potentiel". Si un fragment réussit les différents tests de rastérisation (au stade des opérations raster, décrit ci-après), le fragment met à jour un pixel dans le tampon de trame.
Vertex Shaders et Fragment Shaders sont tous deux des fonctionnalités d'implémentation 3D qui n'utilisent pas le rendu en pipeline fixe. Dans tous les rendus de rendu 3D, les vertex shaders sont appliqués avant les shaders fragment/pixel.
Le vertex shader opère sur chaque sommet. Si vous avez un maillage de polygone fixe et que vous souhaitez le déformer dans un shader, vous devez l'implémenter dans le vertex shader. C'est à dire. tout changement physique dans les apparences de sommet peut être effectué dans les vertex shaders.
Fragment shader prend la sortie du vertex shader et associe les couleurs, la valeur de profondeur d'un pixel, etc. Après ces opérations, le fragment est envoyé à Framebuffer pour être affiché à l'écran.
Certaines opérations, comme par exemple le calcul de l'éclairage, peuvent être exécutées dans des vertex shader ou des fragments shader. Mais fragment shader donne un meilleur résultat que le vertex shader.
Lors du rendu des images via du matériel 3D, vous avez généralement un maillage (points, polygones, lignes) qui sont définis par des sommets. Pour manipuler les sommets individuellement, généralement pour les mouvements d'un modèle ou les vagues d'un océan, vous pouvez utiliser des vertex shaders. Des couleurs statiques ou des couleurs attribuées par les textures à ces sommets peuvent être utilisées pour manipuler les couleurs de sommet à l'aide de nuanceurs. À la fin du pipeline, lorsque la vue passe à l'écran, vous pouvez également utiliser des shaders de fragments.