2010-11-24 26 views
0

Quelqu'un pourrait-il m'expliquer les jolis principes de l'interaction pixel et vertex shader.Question d'optimisation du shader C++

Les choses évidentes sont que vertex shaders reçoivent des propriétés de sommet de base puis repassent certains d'entre eux au pixel shader réelle.

Mais comment se passe la transition vertex->pixel? Je sais que évidemment tous les types de pipelines incluent le changement de rasterizer, qui est capable d'interpoler les paramètres de vertex et peut appliquer des textures basées sur les coordonnées de certaines textures.

Et pour autant que je comprends ceux-ci sont également interpolées (pas tout à fait sûr de ce moment, entendu parler de mathématiques dérivé UV complexe, mais je suppose que nous pouvons dire qu'ils sont interpolés).


Donc, voici quelques questions "ciblées".

Comment fonctionne le pixel shader? Je veux dire que pixel shader fait évidemment quelques actions "par pixel", mais en raison de la transition non visible vertex-> pixel cela donne quelques questions.

Puis-je supposer que si j'évalue la matrice - vecteur produitune fois dans mon pixel shader, il serait évalué une fois lorsque l'image est pixellisée? Ou serait-il préférable d'évaluer tout ce qui est possible dans mon vertex shader et de le passer ensuite au pixel shader?

Aussi, si quelqu'un pouvait pointer des articles/résumés sur ce sujet, j'apprécierais vraiment cela.

Merci.


MISE À JOUR

Je pensais que ce n'a pas d'importance, parce que l'interaction devrait être assez même partout. Je développe applications de visualisation et jeux pour les postes de travail, en utilisant HLSL/GLSL/Nvidia CG pour les shaders et surtout C++ comme langue de base.

+0

Vous pourriez obtenir une meilleure réponse si vous expliquez ce que la plate-forme/API que vous tentez d'utiliser. Il vous manque probablement un tag de sujet ou deux. En l'état, je ne sais même pas de quoi tu parles. –

+0

@Noah Voir la mise à jour –

+0

pourquoi est-ce marqué C++? Les shaders sont, par définition, écrits dans un langage shader tel que GLSL ou Cg, et pas en C++? – jalf

Répondre

3

Le vertex shader est exécuté une fois pour chaque sommet. Il vous permet de transformer le sommet à partir des coordonnées de l'espace mondial (ou de n'importe quel autre système de coordonnées) en coordonnées d'espace. C'est-à-dire que si vous avez un triangle, chaque sommet est transformé, de sorte qu'il finit avec une position sur l'écran.

Et étant donné ces positions, le rasterizer détermine quels pixels sont couverts par le triangle engendré par ces trois sommets.

Et puis, pour chaque pixel à l'intérieur du triangle, le pixel shader est invoqué.La sortie du vertex shader est généralement interpolée pour chaque pixel, ainsi les pixels proches du sommet v0 recevront des valeurs très proches de celles calculées par le vertex shader pour v0.

Et cela signifie que tout ce que vous faites dans le pixel shader est exécuté une fois par pixel couvert par la primitive étant pixellisée

+0

En plus de cela, ou même en conséquence, vous devez effectuer autant de fonctionnalités que possible dans le vertex shader, car il fonctionne beaucoup moins souvent que le pixel shader. – Flinsch

+0

Oui. Dans certains cas, vous voudrez peut-être même tirer toutes les opérations dans votre code C++ côté processeur. Tout dépend de la fréquence de variation des données. S'il est commun à tous les pixels d'un triangle, placez-le dans le vertex shader. Si c'est commun pour tout le shader, mettez-le comme une constante à l'extérieur du shader. – jalf