2017-10-02 14 views
0

J'ai appris DirectX 11, et dans le livre que je suis en train de lire, il indique que le Rasterizer génère des Fragments. Il est de ma compréhension, que ces fragments sont la sortie du Rasterizer (qui introduit des primitives géométriques), et en fait ne sont que 2D Positions (votre 2D Render Target View)DirectX 11 Qu'est-ce qu'un fragment?

Voici ce que je pense que je comprends, s'il vous plaît corriger moi. Le Rasterizer utilise des primitives géométriques (sphères, cubes ou boîtes, tores , pyramides, maillages triangulaires ou maillages polygonaux) (https://en.wikipedia.org/wiki/Geometric_primitive). Il traduit ensuite ces primitives en pixels (ou points) qui sont mappés à votre vue cible de rendu (c'est-à-dire en 2D). C'est ce qu'est un Fragment. Pour chaque fragment, il exécute Pixel Shader, afin de déterminer sa couleur. Cependant, je suppose seulement parce qu'il n'y a pas d'explication simple de ce que c'est (que je peux trouver).

Mes questions sont ...

1: Qu'est-ce qu'un Rasterizer? Quelles sont les entrées et quelle est la sortie?

2: Qu'est-ce qu'un fragment, par rapport à la sortie Rasterizer.

3: Pourquoi un fragment est-il une valeur float 4 (SV_Position)? Si c'est seulement l'espace d'écran 2D pour la vue cible de rendu? 4: Comment est-il corrélé à la sortie cible de rendu (la texture de l'écran 2D)? 5: Est-ce la raison pour laquelle nous effaçons la vue Render Target View (quelle que soit la couleur), car Razterizer et Pixel Shader ne s'exécutent pas sur tous les emplacements X, Y de la vue Render Target View?

Merci!

+0

Je vous recommande de jeter un oeil à certains manuels classiques sur l'infographie 3D. Il vous manque une compréhension de base du fonctionnement de * tous * les pipelines 3D. Une fois que vous avez ce contexte, vous pouvez alors apprendre comment exactement l'API Direct3D correspond au pipeline 3D classique et vous permettra de mieux comprendre comment le matériel l'accélère. Je n'écris plus de routines de numérisation de triangles texturées par logiciel - et je n'ai jamais été particulièrement doué pour ces routines - mais même une implémentation de logiciel merdique vous apprendra beaucoup de ce qui se passe ici. –

+1

Le manuel classique ici est [Foley et vam Dam] (https://www.amazon.com/Computer-Graphics-Principles-Practice-2nd/dp/0201848406). [Hearn et Baker] (https://www.amazon.com/Computer-Graphics-C-Version-2nd/dp/0135309247) est assez bon, tout comme le [Watt] (https://www.amazon.com/Computer-Graphics-3e-Alan-Watt/dp/0201398559) livre. –

+0

@ChuckWalbourn Merci! Recommandez-vous ces vieux livres de temps, ou obtenez-vous une version améliorée? Je cherche des réponses que je suppose ne sont pas présentes dans les livres génériques directx. Malheureusement, j'ai besoin de connaître les raisons pour lesquelles quelque chose fonctionne avant d'avoir le moment "AHA". – Mike5050

Répondre

1

Je ne me DirectXI mais OpenGL à la place, mais la terminologie devrait bi similaire, voire même. Je crois comprendre ceci:

(scene geometry)  -> [Vertex shader]    -> (per vertex data) 
(per vertex data) -> [Geometry&Teseletaion shader] -> (per primitive data) 
(per primitive data) -> [rasterizer]     -> (per fragment data) 
(per fragment data) -> [Fragment shader]    -> (fragment) 
(fragment)   -> [depth/stencil/alpha/blend...]-> (pixels) 

Ainsi, dans shaders Vertex vous pouvez effectuer toutes par des opérations de sommet aiment transformer des systèmes de coordonnées, de pré-calcul des paramètres nécessaires etc.

En géométrie et teselation vous pouvez calculer les normales de la géométrie, émettent/convertissent des primitives et bien plus encore.

Le Rasterizer convertit ensuite la géométrie (primitive) en fragments. Ceci est fait par interpolation. Il divise fondamentalement la partie vue de n'importe quelle primitive en fragments. Voir convex polygon rasterizer.

Les fragments ne sont pas des pixels ni des super pixels, mais ils en sont proches. La différence est qu'elles peuvent être émises ou non en fonction des circonstances et de la configuration du pipeline (les pixels sont des sorties visibles). Vous pouvez les considérer comme des super-pixels possibles.

Le fragment shader convertit les données par fragment en fragments finaux. Ici vous calculez l'éclairage par fragment/pixel, l'ombrage, en faisant toutes les choses de texture, calculez les couleurs etc.La sortie est aussi un fragment qui est fondamentalement un pixel + quelques informations supplémentaires donc il n'a pas seulement la position et la couleur mais peut aussi avoir d'autres propriétés (comme plus de couleurs, profondeur, alpha, pochoir, etc.).

Ceci entre dans le combineur final qui fournit le test de profondeur et tous les autres tests ou fonctionnalités activés tels que le mélange. Et seulement cette sortie va dans framebuffer comme pixel.

Je pense que cela a répondu # 1, # 2, # 4.

maintenant # 3 (je peux me tromper ici en raison de mon manque de connaissances sur DirectX) dans les données par fragment, vous avez souvent besoin position 3D de fragments pour l'éclairage approprié ou ce que les calculs et comme homogenuous coordinates sont utilisé nous avons besoin de 4D (x, y, z, w) vecteur pour cela. Le fragment lui-même possède les coordonnées 2D, mais la position 3D est sa valeur interpolée à partir de la géométrie transmise depuis le shader Vertex. Donc, il ne peut pas contenir la position de l'écran, mais les coordonnées du monde à la place (ou tout autre). Oui, la scène peut ne pas couvrir tout l'écran et/ou vous devez prérégler les tampons tels que Profondeur, Stencil, Alpha pour que le rendu fonctionne comme il se doit et n'est pas invalidé par les résultats de frame précédents. Nous devons donc effacer les framebuffers en général au début du frame. Certaines techniques nécessitent des effacements multiples par image d'autres (comme l'effet de lueur) efface une fois par images multiples ...

+0

Merci! Cela éclaircit beaucoup de mon côté. – Mike5050