133
1 Infographie Pipeline graphique OpenGL, DirectX etc …

Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

1

Infographie

Pipeline graphiqueOpenGL, DirectX etc …

Page 2: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

2

Infographie

Pipeline graphique

Approche complémentaire du ray-tracing Beaucoup de versions

Implémentation logicielle, ex. Pixar Renderman But ici : rapidité sans perdre trop en réalisme (flexibilité) Faire le rendu d'un film de 2 heures en 1 an impose 3 minutes

de calcul par image … (mais c'est facilement parallélisable) Implémentation matérielle, e.g. cartes graphiques PC

Temps (presque) réel : plusieurs millions de triangles rendus par seconde

On va se concentrer sur une « abstraction » d'une implémentation matérielle

Page 3: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

3

Infographie

Pipeline graphique

On parle de Pipeline graphique

But ici : opérations facilement parallélisables Groupes de processeurs dédiés permettant d'exécuter

de plusieurs dizaines à plusieurs milliers d'opérations en parallèle.

→ performance des GPU ( plusieurs fois celle des CPU à 1/5 de la fréquence d'horloge)

Mémoire dédiée

Page 4: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

4

Infographie

Pipeline graphique

Performance des échanges (les données ont qq années - 2010)

Doc

umen

t N

vidi

a

Page 5: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

5

Infographie

Pipeline graphique

Organisation particulière d'un GPU

Doc

umen

t N

vidi

a

Page 6: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

6

Infographie

Pipeline graphique

Pipeline

Flux de commandes

Géométrie transformée

Fragments ( ~ pixels + données interpolées )

Mémoire de trame (framebuffer)

Application

Opérations sur les sommets (vertex processing)

Rastérisation

Opérations sur les fragments (fragment processing)

Affichage

On est ici

Transformations 3D, ombrage

Composition, mélange, (ombrage)

Ce que l'utilisateur voit

Standards « langage »OpenGL, DirectX etc...

Conversion des primitives en

fragments

Page 7: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

7

Infographie

Pipeline graphique

Primitives Points (dans l'espace) Segments de droite

Chaînes de segments connectés Triangles

Chaînes de triangles C'est tout !

Courbes ? Approchées par des chaînes de segments Polygones ? Décomposés en triangles Surfaces courbes ? Approchées par des triangles

La « mode » actuelle est de se restreindre à un minimum de primitives

Simple, uniforme, répétitif → bon pour le parallélisme

Page 8: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

8

Infographie

Pipeline graphique

Flux de commandes : dépend de l'implémentation Ex: OpenGL 1, DirectX, autres On retrouve toujours un peu les mêmes choses

Cf Tps pour OpenGL Avantages d'OpenGL :

Multiplateforme, simple, performant, évolutif et non attaché à une compagnie/architecture .

Page 9: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

9

Infographie

Pipeline graphique

Pipeline

Flux de commandes

Géométrie transformée

Fragments ( ~ pixels + données interpolées )

Mémoire de trame (framebuffer)

Application

Opérations sur les sommets (vertex processing)

Rastérisation

Opérations sur les fragments (fragment processing)

Affichage

On est ici

Transformations 3D, ombrage

Composition, mélange, ombrage,

Ce que l'utilisateur voit

Conversion des primitives en

fragments

Page 10: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

10

Infographie

Pipeline graphique

Pipeline des transformations géométriques

Page 11: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

11

Infographie

Pipeline graphique

Page 12: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

12

Infographie

Pipeline graphique

Clipping Les opérations de rastérisation supposent que les

triangles (ou les lignes) sont visibles sur l'écran Ceci est effectué dans l'espace 3D canonique, après

l'application de la matrice de projection perspective (cf cours 2 ), mais avant la division perspective.

Tout ce qui n'est pas dans le volume

est « éliminé » Coupure

contre 6 plans

−wxw−w yw−w zw

Page 13: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

13

Infographie

Pipeline graphique

Clipping Opération de base : couper un triangle en 3 par un

plan 4 cas :

Tous les points dedanson garde le triangle

Tous à l'extérieuron rejette le triangle

1 sommets dedans; 2 dehors → 1 triangle reste 2 sommets dedans; 1 dehors → 2 triangles restent

Page 14: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

14

Infographie

Pipeline graphique

Élimination des faces cachées On a discuté de comment transformer les primitives

vers l'écran (géométriquement parlant) La projection perspective donne un indice de

profondeur L'élimination des faces cachées donne un autre

indice très important. Possibilité de ne dessiner que ce qui est visible

(raison : performance accrue)

Page 15: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

15

Infographie

Pipeline graphique

Élimination des faces cachées « backface culling » = occlusion des faces arrières Pour des formes fermées et opaques, on ne voit

pas ce qui est dedans

Page 16: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

16

Infographie

Pipeline graphique

Élimination des faces cachées « backface culling » = occlusion des faces arrières Inutile de tracer les faces « à l'arrière »

vn

n

v

Page 17: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

17

Infographie

Pipeline graphique

Élimination des faces cachées « backface culling » = occlusion des faces arrières Inutile de tracer les faces « à l'arrière »

vn

n

v

v⋅n≤0

Page 18: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

18

Infographie

Pipeline graphique

Élimination des faces cachées « backface culling » = occlusion des faces arrières Dépend de la convention sur la normale

En principe, normale extérieure. Le calcul ne se fait correctement que si les triangles sont

orientés convenablement

s1

n=s1 s2×s1 s3

∥s1 s2×s1 s3∥

s2

s3

Page 19: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

19

Infographie

Pipeline graphique

Faces cachées Comment traiter le cas suivant ?

Algorithme du peintre « simple » Arbre de partitionnement binaire Z-buffer

Page 20: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

20

Infographie

Pipeline graphique

Algorithme du peintre Idée : tracer toutes les primitives dans le bon ordre On écrase ce qui se trouve en dessous

Page 21: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

21

Infographie

Pipeline graphique

Algorithme du peintre Idée : tracer toutes les primitives dans le bon ordre On écrase ce qui se trouve en dessous

Page 22: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

22

Infographie

Pipeline graphique

Algorithme du peintre Idée : tracer les primitives dans le bon ordre On écrase ce qui se trouve en dessous

Revient à effectuer un tri topologique Trouver un chemin dans un graphe orienté

AB

C

D

EF

A

B

C

D

E

F

ABCDEFABDCFECAEBDF...

Page 23: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

23

Infographie

Pipeline graphique

Algorithme du peintre Impossible en présence de cycles ...

A

B

C

A

B

C

ABC ???

Page 24: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

24

Infographie

Pipeline graphique

Algorithme du peintre Impossible en présence de cycles …

Solution : découpage

a

f

o

b,l cd,g

m

k

ej

i,n

h a

o

l

cg

m

k

ei

h

db

n

Page 25: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

25

Infographie

Pipeline graphique

Algorithme du peintre Utile lorsqu'un ordre est facile à déterminer Génération de

dessins vectoriels

Fol

ey e

t al.

Page 26: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

26

Infographie

Pipeline graphique

Algorithme du peintre L'ordre des opérations de dessin dépend du point

de vue Le classement des primitives est coûteux (en

nlog(n) au mieux ) et doit être refait dès que l'observateur bouge

Les primitives doivent être découpées si elles forment des cycles (comment le détecter ?)

Réponse à ces problèmes : Arbre de partition spatiale binaire (BSP Tree)

Page 27: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

27

Infographie

Pipeline graphique

BSP Tree Données d'entrée :

Série de segments en 2D Série de triangles en 3D – raisonnement identique

a b

c

d

e

Page 28: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

28

Infographie

Pipeline graphique

Construction du BSP Tree (1)

a b.1

c

d

e

b.2

c+ -

+

-

→ Prendre un des segments et définir un plan coupant le domaine en deux sous domaines signés

→ Classer les autres segments d'un côté ou de l'autre du plan. Si un segment est à cheval, lepartitionner et classer les parties.

→ Dans chaque sous domaine, si il y a plus d'un segment,refaire la même opération récursivement.

Page 29: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

29

Infographie

Pipeline graphique

Construction du BSP Tree (2)

a b.1

c

d

e.1

b.2

c

e.2

d

+ -+

-

+- +-

e.1

→ Prendre un des segments et définir un plan coupant le domaine en deux sous domaines

→ Classer les autres segments d'un côté ou de l'autre du plan. Si un segment est à cheval, lepartitionner et classer les parties.

→ Dans chaque sous domaine, si il y a plus d'un segment,refaire la même opération récursivement.

Page 30: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

30

Infographie

Pipeline graphique

Construction du BSP Tree (3)

a b.1

c

d

e.1

b.2

e.2

c

d b.1

a

+ -+

-

+-

+-

e.1

→ Prendre un des segments et définir un plan coupant le domaine en deux sous domaines

→ Classer les autres segments d'un côté ou de l'autre du plan. Si un segment est à cheval, lepartitionner et classer les parties.

→ Dans chaque sous domaine, si il y a plus d'un segment,refaire la même opération récursivement.

Page 31: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

31

Infographie

Pipeline graphique

Construction du BSP Tree (4)

a b.1

c

d

e.1

b.2

e.2

c

d b.1

a

+ -+

-

+-

+-

e.1+

-

e.2

b.2

→ Prendre un des segments et définir un plan coupant le domaine en deux sous domaines

→ Classer les autres segments d'un côté ou de l'autre du plan. Si un segment est à cheval, lepartitionner et classer les parties.

→ Dans chaque sous domaine, si il y a plus d'un segment,refaire la même opération récursivement.

Page 32: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

32

Infographie

Pipeline graphique

Comment choisir le « bon » plan de découpage à chaque étape ?

Un choix aléatoire n'est pas mauvais... Algorithme complet

Soit S un ensemble de segments (ou triangles en 3D)Build(S,BSP){

Si (Card(S) <=1) BSP est un arbre avec un seul noeud, contenant l'éventuel segment de SSinon {

Utiliser un segment aléatoire s de S comme ligne de coupure et découper les autres segmentsS+ = segments appartenant à H+ (demi espace « positif ») (sans s)S- = segments appartenant à H- (demi espace « négatif ») (sans s)Build(S+,BSP+)Build(S-,BSP-)Cree un arbre avec comme racine BSP, enfants BSP+ et BSP-, la racine contient s

}}

Page 33: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

33

Infographie

Pipeline graphique

Utilisation du BSP Tree Comment parcourir l'arbre afin d'obtenir l'ordre

d'affichage correct ?

a

+ -

e.1

b.2

ObservateurO

Prenons O c+→ Il est clair que les entités de c- doivent être affichées AVANT les entités sur c, qui doivent être affichées AVANT celles contenues dans c+

c

d b.1

e.2

a b.1

c

d

e.1

b.2

e.2

+

-

+-

+-

+

-

Page 34: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

34

Infographie

Pipeline graphique

Utilisation du BSP Tree Comment parcourir l'arbre afin d'obtenir l'ordre

d'affichage correct ?

a

+ -

e.1

b.2

ObservateurO

c- c c+La question se repose pour c- (puis c+)O b.1- donc les entités de b.1+ doivent être affichées AVANT les entités sur b.1, qui doivent être affichées AVANT celles contenues dans b.1-

1

23

4

5

c

d b.1

e.2

a b.1

c

d

e.1

b.2

e.2

+

-

+-

+-

+

-

Page 35: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

35

Infographie

Pipeline graphique

Utilisation du BSP Tree Comment parcourir l'arbre afin d'obtenir l'ordre

d'affichage correct ?

a

+ -

e.1

b.2

ObservateurO

a b.1 (b.1-) c c+La question se repose pour c+O d+ donc les entités de d- doivent être affichées AVANT les entités sur d, qui doivent être affichées AVANT celles contenues dans d+

1

23

4

5

6 c

d b.1

e.2

a b.1

c

d

e.1

b.2

e.2

+

-

+-

+-

+

-

Page 36: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

36

Infographie

Pipeline graphique

Utilisation du BSP Tree Comment parcourir l'arbre afin d'obtenir l'ordre

d'affichage correct ?

a

+ -

e.1

b.2

ObservateurO

a b.1 (b.1-) c d- d d+

1

23

4

5

6

7

8

9

c

d b.1

e.2

a b.1

c

d

e.1

b.2

e.2

+

-

+-

+-

+

-

Page 37: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

37

Infographie

Pipeline graphique

Utilisation du BSP Tree Comment parcourir l'arbre afin d'obtenir l'ordre

d'affichage correct ?

a

+ -

e.1

b.2

ObservateurO

a b.1 (b.1-) c e.1 d d+La question se repose pour d+O e.2+ donc les entités de e.2- doivent être affichées AVANT les entités sur e.2, qui doivent être affichées AVANT celles contenues dans e.2+

1

23

4

5

6

7

8

9

10101112

c

d b.1

e.2

a b.1

c

d

e.1

b.2

e.2

+

-

+-

+-

+

-

Page 38: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

38

Infographie

Pipeline graphique

Utilisation du BSP Tree Comment parcourir l'arbre afin d'obtenir l'ordre

d'affichage correct ?

a

+ -

e.1

b.2

ObservateurO

a b.1 (b.1-) c e.1 d b.2 e.2 (e.2+)

Ordre final : a b.1 c e.1 d b.2 e.2

1

23

4

5

6

7

8

9

10101112

c

d b.1

e.2

a b.1

c

d

e.1

b.2

e.2

+

-

+-

+-

+

-

Page 39: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

39

Infographie

Pipeline graphique

Algorithme de parcours récursifDraw(BSP,ViewPoint){

Si BSP est une feuille (pas d'enfants)Dessine les primitives contenues dans BSP

Sinon{

Soit BSP+ et BSP- les enfants de BSPSi ViewPoint est dans H- (demi espace « negatif »){

Draw(BSP+,ViewPoint)Dessine les primitives contenues dans BSPDraw(BSP-,ViewPoint)

}Sinon Si ViewPoint est dans H+ (demi espace « positif »){

Draw(BSP-,ViewPoint)Dessine les primitives contenues dans BSPDraw(BSP+,ViewPoint)

}Sinon (on est juste sur le plan de jonction){

(Dessine les primitives contenues dans BSP) /pas obligatoireDraw(BSP+,ViewPoint)Draw(BSP-,ViewPoint)

}}

}

BSP

BSP-BSP+

Page 40: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

40

Infographie

Pipeline graphique

L'arbre BSP n'est généralement pas utilisé directement dans les cartes graphiques.

Construction relativement lente (au mieux en nlogn si l'arbre final est balancé), structure de données complexe

→ Z-buffer : cf plus loin Il peut par contre être utilisé dans certains cas de

façon logicielle pour « faciliter » le travail des cartes graphiques

Ex. Jeux vidéos « FPS » ou les décors sont fixes, mis à part quelques parties animées

« Doom » est un jeu vidéo qui fut précurseur dans cette utilisation

Il peut aussi être utilisé en ray-tracing...

Page 41: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

41

Infographie

Pipeline graphique

Pipeline

Flux de commandes

Géométrie transformée

Fragments ( ~ pixels + données interpolées )

Mémoire de trame (framebuffer)

Application

Opérations sur les sommets (vertex processing)

Rastérisation

Opérations sur les fragments (fragment processing)

Affichage

On est ici

Transformations 3D, ombrage

Conversion des primitives en

fragments

Composition, mélange, ombrage,

Ce que l'utilisateur voit

Page 42: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

42

Infographie

Pipeline graphique

Rastérisation Première étape : énumérer les pixels couverts par

la primitive « continue » Seconde étape : Interpoler des valeurs connues

aux sommets de la primitive Exemple : la couleur connue aux sommets d'un triangle

doit être « distribuée » sur chaque pixel du triangle. D'autres grandeurs peuvent être interpolées. Par

exemple, les normales si elles sont connues aux sommets

Page 43: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

43

Infographie

Pipeline graphique

Rastérisation Transformation des primitives « continues » en

pixels Exemple : tracé d'une droite Point délicat : aliasing

Page 44: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

44

Infographie

Pipeline graphique

Algorithme trivial Ligne = rectangle de largeur unité On spécifie les deux points Cas considéré : noir à l'intérieur du rectangle, blanc

à l'extérieur

Page 45: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

45

Infographie

Pipeline graphique

Algorithme naïf Ligne = rectangle de largeur unité On spécifie les deux points Cas considéré : noir à l'intérieur du rectangle, blanc

à l'extérieur

Page 46: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

46

Infographie

Pipeline graphique

Échantillonnage de points On approche le rectangle en traçant tous les pixels

dont le centre est situé dans le rectangle

Page 47: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

47

Infographie

Pipeline graphique

Échantillonnage de points On approche le rectangle en tracant tous les pixels

dont le centre est situé dans le rectangle Problème : parfois, on allume des pixels deux fois

adjacents

Page 48: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

48

Infographie

Pipeline graphique

Page 49: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

49

Infographie

Pipeline graphique

Algorithme de Bresenham (point milieu) On va définir l'épaisseur de la ligne parallèlement

aux axes...

Page 50: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

50

Infographie

Pipeline graphique

Algorithme de Bresenham (point milieu) On va définir l'épaisseur de la ligne parallèlement

aux axes... On allume un

seul pixel par colonne

Les lignes à 45° seront enapparenceplus fines.

Page 51: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

51

Infographie

Pipeline graphique

Algorithme de Bresenham (point milieu) On va définir l'épaisseur de la ligne parallèlement

aux axes... On allume un

seul pixel par colonne

Les lignes à 45° seront enapparenceplus fines.

Page 52: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

52

Infographie

Pipeline graphique

Page 53: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

53

Infographie

Pipeline graphique

Algorithme de tracé de ligne Equation : On évalue l'equation à chaque colonne On allume un

seul pixel par colonne

y=mxb

x0x1

0≤m≤1for x = ceil(x0) to floor(x1) y=b+m*x plot(x,round(y))

0

1

2

4

5

6

7

3

y=0.49x−0.01

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Page 54: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

54

Infographie

Pipeline graphique

Optimisation Multiplications et arrondis sont des opérations

lentes Pour chaque pixel, les seules options sont E et NE

On calcule l'erreur commise d > 0.5 décide

entre E et NE

d=m x1b− y

0

1

2

4

5

6

7

3

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

x , y

NE

E

y=mxbmxb− y=0

Page 55: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

55

Infographie

Pipeline graphique

Optimisation On doit seulement mettre à jour avec des pas

entiers en x et y Utilisation exclusive de l'addition (pas de

multiplication ni division d > 0.5 décide

entre E et NE On parle d'

« analyseurdigitaldifférentiel »

d=m x1b− y

0

1

2

4

5

6

7

3

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

d=dmd=d−1

Page 56: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

56

Infographie

Pipeline graphique

Optimisation

0

1

2

4

5

6

7

3

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

x=ceil(x0) // arrondi sup.y=round(m*x+b) // arrondid=m*(x+1)+b-yWhile (x<floor(x1)) // arrondi inf.{ If d>0.5 { y=y+1 d=d-1 } x=x+1 d=d+m plot(x,y)}

Page 57: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

57

Infographie

Pipeline graphique

En général on dispose des points extrémité

Forme implicite :

y=dydx

⋅x+b x0

y0

x1

y1

dx=x1−x0

dy= y1− y0

G x , y =dy⋅x−dx⋅ydx⋅b

G x , y0

G x , y 0

G x , y =0

≡F x , y=2 dy⋅x−2 dx⋅y2 dx⋅b

Page 58: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

58

Infographie

Pipeline graphique

Calcul de la valeur de F au point M

: M est sous la droitechoix NE

: M est au dessuschoix E

d i=F x i1, yi1/2=2 dy⋅x i1−2 dx⋅ y i1 /22 dx⋅b

M

Q

NE?

E?

d i0

d i≤0

x i , y i

Page 59: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

59

Infographie

Pipeline graphique

Premier point: que vaut ?

Comme fait partie de la droite,

d 0

d 0=F x01, y01 /2=2 dy⋅ x01−2 dx⋅ y01/22 dx⋅b

=2 dy x0−2 dx⋅y02 dx⋅b2 dy−dx

=F x0, y02 dy−dx

x0, y0 F x0, y0=0

d 0=2dy−dx

Page 60: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

60

Infographie

Pipeline graphique

Récurrence : que vaut ? Si alors on est allé à l' E :

Sinon on est allé au NE :

d i1

d i≤0

x i1 , y i1=x i1 , y i

x i1 , y i1=x i1 , y i1

d i1=F x2, y1/2=d i2 dy

d i1=F x2, y3 /2=d i2 dy−2 dx

Page 61: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

61

Infographie

Pipeline graphique

Algorithme valable pour un octant

Bresenham( x1, y1, x2, y2 ){

dx = x2 – x1dy = y2 – y1d = 2*dy – dxplot( x1, y1 )while (x1 < x2 ){

if (d <= 0) // ESTd = d + 2*dy

else // NORD-EST{

d = d + 2*(dy-dx)y1 = y1 + 1

}x1 = x1 + 1plot( x1, y1 )

}}

Page 62: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

62

Infographie

Pipeline graphique

Que faire si l'on ne se trouve pas dans le bon octant ?

Intervertir x et y Intervertir les points de départ et d'arrivée Remplacer y par -y

Page 63: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

63

Infographie

Pipeline graphique

Il existe le même genre d'algorithme pour tracer les cercles (cf littérature)

Qu'en est il de l'aliasing ? Existence d'algorithmes dérivés de celui de Bresenham

permettant de traiter l'aliasing directement

Cf . Algorithme de X. Wu Oversampling → discrétisation sur une grille plus fine,

puis moyenne dans les « gros » pixels.

Bresenham, Jack E. "Algorithm for computer control of a digital plotter", IBM Systems Journal, Vol. 4, No.1, pp. 25–30, 1965

Wu, Xiaolin. "An efficient antialiasing technique". Computer Graphics 25 (4): 143–152, 1991.

Page 64: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

64

Infographie

Pipeline graphique

Page 65: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

65

Infographie

Pipeline graphique

Interpolation On attribue des valeurs aux sommets (couleur,

normale, etc...) On souhaite disposer d'une valeur représentative le

long de la ligne, pour chaque pixel « allumé » On aimerait une variation progressive d'une valeur

à l'autre le long de la ligne 1D :

2D,3D : est simplement la fraction de distance entre les points de départ et d'arrivée.

f x=1− f 0 f 1

=x−x0/ x1−x0

Page 66: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

66

Infographie

Pipeline graphique

Interpolation Les pixels ne sont pas situés exactement sur la

ligne On définit une fonction par projection sur la ligne

C'est linéaire Donc on peut

utiliser lesrésultats pré-cédents pourinterpoler

P0

P1

v

=v x / L=v y / L

=v⋅Q−P0/ L

L=v⋅P1−P0

Page 67: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

67

Infographie

Pipeline graphique

Interpolation Les pixels ne sont pas situés exactement sur la

ligne On définit une fonction par projection sur la ligne

C'est linéaire Donc on peut

utiliser lesrésultats pré-cédents pourinterpoler

P0

P1

v

=v x / L=v y / L

=v⋅Q−P0/ L

L=v⋅P1−P0

Page 68: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

68

Infographie

Pipeline graphique

Interprétation alternative On met à jour d et de pixel en pixel

d nous dit à quelle distance on se trouve de la ligne nous dit à quelle position on se trouve le long de la

ligne

d et sont des coordonnées par rapport à un repère lié avec la ligne

Page 69: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

69

Infographie

Pipeline graphique

Interprétation alternative La boucle signifie la visite des pixels par lesquels

passe la ligne Interpolation de d et pour chaque point Émission d'un fragment si le pixel est dans la bande

L'interpolationdevient l'opé-ration primaire

P0

P1

v

u

Page 70: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

70

Infographie

Pipeline graphique

Interprétation alternative

P0

P1

v

u

x=ceil(x0)y=round(m*x+b)d=m*(x+1)+b-y etc...while (x<floor(x1)){

if (d>0.5){

y=y+1d=d-1 etc ...

} else

{x=x+1d=d+m etc...

}If (-0.5 < d <= 0.5)

plot(x,y, … )}

Page 71: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

71

Infographie

Pipeline graphique

Rastérisation des triangles Cas le plus commun dans la plupart des

applications Avec un bon antialiasing, cela peut être le seul cas !

Certains systèmes effectuent le rendu d'une ligne avec deux triangles très allongés

Triangle représenté par 3 sommets L'algorithme se présente sous la même forme

que l'algorithme de rasterisation d'une ligne On marche de pixel en pixel Calcul de fonctions linéaires au fur et à mesure Celles ci nous permettent de savoir si on est dedans... ou

dehors

Page 72: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

72

Infographie

Pipeline graphique

Rastérisation des triangles En entrée :

Trois points 2D Des valeurs à interpoler à chaque pixel

En sortie : une liste de fragments, avec : Les coordonnées entières des pixels Les valeurs interpolées

x0 , y0 ; x1 , y1; x2 , y2

q00 ,⋯, q0 n ; q10 ,⋯, q1 n ; q20 ,⋯ , q2 n

x , y

q0 ,⋯ , qn

Page 73: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

73

Infographie

Pipeline graphique

Rastérisation des triangles Évaluation incrémentale de fonctions linéaires sur

les pixels de la grille Fonctions définies par des valeurs spécifiées aux

les sommets Utilisation de

fonctions spécifiques pour déterminerl'ensemble des fragmentsà renvoyer x0 , y0

q00 ,⋯ , q0n

x1 , y1

q10 ,⋯ , q1n

x2 , y2

q20 ,⋯ , q2n

(x , y)

q0 ,⋯ , qn

sommet

fragment

Page 74: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

74

Infographie

Pipeline graphique

Evaluation linéaire incrémentale Une fonction linéaire (affine) sur le plan est :

Il est efficace de l'évaluer sur une grille :q x , y =c x xc y yck

q x1, y=c x x1c y yck=q x , yc x

q x , y1=c x xc y y1ck=q x , y c y

+cx+c

x+c

x

+cy

+cy

.....

.....

Page 75: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

75

Infographie

Pipeline graphique

Interpolation des valeurs aux sommets Déterminer qui définissent la fonction

linéaire unique qui donne les valeurs correctes aux sommets

3 paramètres , trois équations :

Matrice singulière si le triangle est dégénéré (trois points alignés)

cx , c y , ck

c x x0c y y0ck=q0

c x x1c y y1ck=q1

cx x2c y y2ck=q2x0 y0 1x1 y1 1x2 y2 1

cx

c y

ck=

q0

q1

q2

Page 76: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

76

Infographie

Pipeline graphique

Interpolation des valeurs aux sommets Translation de l'origine des axes vers

Système linéaire 2x2

Solution en utilisant la règle de Cramer

x0 , y0

q x , y=c x x−x0c y y− y0q0

q x1, y1=c x x1−x0c y y1− y0q0=q1

q x2, y2=c x x2−x0c y y2− y0q0=q2

x1−x0 y1− y0

x2−x0 y2− y0cx

c y=q1−q0

q2−q0

c x= q1 y2− q2 y1/ x1 y2− x2 y1

c y= q2 x1− q1 x2/ x1 y2− x2 y1

Page 77: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

77

Infographie

Pipeline graphique

Quels sont les fragments à considérer ? Ceux dont ceux dont les coordonnées

barycentriques sont positives … Algébriquement, on a

À l'intérieur si

Pineda, Juan, " A parallel algorithm for polygon rasterization" Computer Graphics 22 (4): 17-20, 1988

a

c

b

, ,

p= a b c=1

0 ;0 ;0

Page 78: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

78

Infographie

Pipeline graphique

Les coordonnées barycentriques sont des fonctions interpolées

Chaque coordonnée vaut 1 sur un sommet , 0 sur les autres

Elles sont une représentation implicite des équations des cotés du triangle...

Page 79: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

79

Infographie

Pipeline graphique

Rasterisation pixel par pixel (Algorithme de Pineda - 1998)

On visite conservativement un super-ensemble des pixels à afficher

Interpolation des fonctions linéaires Utilisation des

fonctions coordonnéesbarycentriquespour savoirquand émettreun fragment

x0 , y0

q00 ,⋯ , q0n

x1 , y1

q10 ,⋯ , q1n

x2 , y2

q20 ,⋯ , q2 n

Page 80: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

80

Infographie

Pipeline graphique

Rasterisation des triangles Attention aux arrondis et décisions arbitraires

On doit visiter ces pixels au moins une fois... (sinon il y a un trou)

Mais pas deux fois ! (ils prendraient alors une couleur arbitraire en fonction de l'ordre du tracé)

Solution élégante :antialiasing...

Page 81: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

81

Infographie

Pipeline graphique

Pipeline

Flux de commandes

Géométrie transformée

Fragments ( ~ pixels + données interpolées )

Mémoire de trame (framebuffer)

Application

Opérations sur les sommets (vertex processing)

Rastérisation

Opérations sur les fragments (fragment processing)

Affichage

On est ici

Transformations 3D, ombrage

Composition, mélange, ombrage,

Ce que l'utilisateur voit

Conversion des primitives en

fragments

Page 82: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

82

Infographie

Pipeline graphique

Le z-buffer (mémoire de profondeur) Dans beaucoup d'applications, maintenir un

classement en profondeur est trop coûteux Le classement change avec le point de vue.

Il existe l'algorithme de partition binaire de l'espace Indépendant du point de vue; mais :

Structures de données associées relativement complexes (difficile à implémenter directement dans le matériel)

Découpage des primitives Construction et initialisation lente On doit généralement connaître l'ensemble des primitives en

avance

Page 83: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

83

Infographie

Pipeline graphique

Solution utilisée habituellement: faire le tracé dans n'importe quel ordre, en gardant trace du plus proche

Utiliser un canal de plus par pixel pour conserver la profondeur la plus faible tracée jusqu'à présent

Quand on trace à nouveau un pixel, on compare la profondeur actuelle avec celle stockée. On ne trace effectivement que si cette dernière est supérieure.

Page 84: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

84

Infographie

Pipeline graphique

Le z-buffer

Exemple de technique de « force brute » utilisant beaucoup de mémoire mais qui est devenu un standard

Fol

ey e

t al.

Page 85: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

85

Infographie

Pipeline graphique

Le z-buffer De façon évidente, limité aux images bitmap (non

vectorielles) Un peu plus difficile à implémenter pour tenir

compte d'un canal alpha...(transparence)

Page 86: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

86

Infographie

Pipeline graphique

Z-buffer et transparence On sépare les objets opaques des autres.

1) Tracer les objets opaques avec mise à jour du z-buffer activée.

2) Ensuite, classer les entités partiellement transparentes dans un arbre BSP

3) Dessiner les entités transparentes dans l'ordre de profondeur décroissante (utiliser le BSP), en tenant compte du z-buffer mais sans mettre celui ci à jour (c'est inutile)

On tient compte du z-buffer car les faces transparentes situées derrière les faces opaques ne sont pas visibles.

Page 87: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

87

Infographie

Pipeline graphique

Le z-buffer : précision limitée Le canal supplémentaire est généralement codé

sous forme d'un entier (comme un canal couleur) :

Cause : Implémentation hardware (simple et rapide) Il est possible d'avoir des objets distincts qui sont

confondus (vus à la même distance) si la valeur (un entier = arrondi) dans le z-buffer est la même

La précision est répartie entre n (le plan proche) et f (le plan lointain)

Ceux ci on déjà servi à définir le volume observable, cf cours 2.

0 z*N −1

Page 88: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

88

Infographie

Pipeline graphique

z*=0

z*=N −1

Plan n Plan f

Le z-buffer

Page 89: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

89

Infographie

Pipeline graphique

Le z-buffer Soit une représentation entière à b bits (8 ou 16...)

Quelle est la précision du z-buffer? Si le z stocké dans le z-buffer est proportionnel à la

distance réelle (cas des projections orthogonales): On dispose de N=2b cases pour une distance de f-n La précision (indépendante de la distance) est donc de

: pour maximiser la précision, il faut minimiser f-n

Si une projection perspective est utilisée, le z stocké dans le z-buffer est proportionnel au résultat obtenu après la division perspective.

La dimension des cases est variable en fonction de la profondeur

z= f −n

2b

Page 90: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

90

Infographie

Pipeline graphique

z*=0 z*

=N −1

Plan n Plan f

Cas orthographique

Cas perspectif

Le z-buffer

Page 91: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

91

Infographie

Pipeline graphique

Le z-buffer Dans le cours 2, on avait calculé z

c après la

transformation perspective et la division :

x , y , z ,1⋅2∣n∣r−l

0 0 0

02∣n∣t−b

0 0

rlr−l

tbt−b

∣ f ∣∣n∣∣n∣−∣ f ∣

−1

0 02∣ f ∣∣n∣∣n∣−∣ f ∣

0

M proj _ persp _ OpenGL

= X ,Y ,∣ f ∣∣n∣∣n∣−∣ f ∣

⋅z2∣ f ∣∣n∣∣n∣−∣ f ∣

,− z z c=

∣ f ∣∣n∣∣ f ∣−∣n∣

2∣ f ∣∣n∣

z ∣ f ∣−∣n∣

zc=f nf −n

2 f n

z f −n

… en comptant f, n et z positivement et avec f >n

Page 92: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

92

Infographie

Pipeline graphique

Le z-buffer L'intervalle pour z

c est 2 (de -1 à 1) et on a toujours

N cases.

On veut connaître la taille des cases dans l'espace réel, on inverse...

La case la plus large est pour z=f :

zc=f nf −n

2 f n

z f −n zc≈

2 z f n

z2 f −n

=2N

z=z2 f −n

N f n

zmax=f f −n

N n

Page 93: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

93

Infographie

Pipeline graphique

Le z-buffer Exemple: n est à 1 mètre, f à 100 mètres, le z-buffer

dispose de 8 bits → N=256, quelle est la répartition des case ?

Avec n=10 :

z=z2 f −n

N f n zmax=

f f −n

N n=

100⋅99256⋅1

=39 m 0.15 m avec 16 bits

zmin=n f −n

N f=

1⋅99256⋅100

=0.0039 m

zmax=f f −n

N n=

100⋅90256⋅10

=3.5 m 0.013 m avec 16 bits

zmin=n f −n

N f=

10⋅90256⋅100

=0.035 m

Page 94: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

94

Infographie

Pipeline graphique

Le z-buffer Pour un bon fonctionnement du z-buffer, il faut donc

maximiser n et minimiser f. Ne surtout pas poser n=0 → équivalent à

désactiver le z-buffer. En général, le nombre de bits b est imposé par

l'architecture matérielle (habituellement 16, 24 ou 32 bits)

Le plus est le mieux mais cela prend autant de mémoire que l'image (habituellement codée sur 24 bits)

Page 95: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

95

Infographie

Pipeline graphique

Interpolation en projection perspectivePlan de projection

œil

Projection des extrémités

Page 96: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

96

Infographie

Pipeline graphique

Interpolation en projection perspectivePlan de projection

œil

Projection du milieu du segment ≠ milieu des projection des points extrémitésInterpolation linéaire dans l'espace de l'écran ≠ de l'interpolation dans l'espace de l'œil.

p1

p2

p1 p2

2

Page 97: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

97

Infographie

Pipeline graphique

Interpolation en projection perspectivePlan de projection

œil

Projection du milieu du segment ≠ milieu des projection des points extrémitésInterpolation linéaire dans l'espace de l'écran ≠ de l'interpolation dans l'espace de l'œil.

z1 z2

Se projette au milieu...

z1z2/2

Page 98: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

98

Infographie

Pipeline graphique

Interpolation en projection perspectivePlan de projection

œil

Projection du milieu du segment ≠ milieu des projection des points extrémitésInterpolation linéaire dans l'espace de l'écran ≠ de l'interpolation dans l'espace de l'œil.

répartition équitable sur z (distance)

Page 99: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

99

Infographie

Pipeline graphique

Interpolation en projection perspectivePlan de projection

œil

Projection du milieu du segment ≠ milieu des projection des points extrémitésInterpolation linéaire dans l'espace de l'écran ≠ de l'interpolation dans l'espace de l'œil.

z c1 z c2

Se projette au milieu...

zc1z c2/2

Page 100: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

100

Infographie

Pipeline graphique

Interpolation en projection perspectivePlan de projection

œil

La grandeur reliée à la profondeur que l'on doit interpoler (au niveau pixel) est zc

(profondeur écran) obtenue après la division perspective, et non z, la coordonnée réelle

répartition équitable sur z c (profondeur écran)

Page 101: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

101

Infographie

Pipeline graphique

La correction de perspective (utilisation de zc au lieu

de z ) permet d'éviter les problèmes avec les textures appliquées sur des surfaces inclinées

F u=1−u F 0u F 1

F u=

1−uF 0

zc0

uF 1

zc1

1−u1zc0

u1zc1

wik

iped

ia

F0

F1

Page 102: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

102

Infographie

Pipeline graphique

Pipeline minimal Etape « sommets » (input : positions 3D / sommet et

couleur / triangle) Transformation de la position (espace objet → espace œil) Transformation de la position (espace œil → espace écran) Passage de la couleur (pas d'interpolation = constante sur le

triangle) Etape « Rasterisation »

Liste de pixels Passage de la couleur

Etape « fragments » (output : couleur) Ecrire directement sur les plans couleur de la mémoire de trame

Page 103: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

103

Infographie

Pipeline graphique

Page 104: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

104

Infographie

Pipeline graphique

Pipeline minimal avec z-buffer Etape « sommets » (input : positions 3D / sommet et

couleur / triangle) Transformation de la position (espace objet → espace œil) Transformation de la position (espace œil → espace ecran) Passage de la couleur (pas d'interpolation = constante sur le

triangle) Etape « Rasterisation »

Interpolation de zc (z dans l'espace écran)

Passage de la couleur

Etape « fragments » (output : couleur, zc)

(Ecrire sur les plans couleur et mettre à jour le z-buffer) si zc < z

c

courant

Page 105: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

105

Infographie

Pipeline graphique

Page 106: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

106

Infographie

Pipeline graphique

Ombrage plat Utilisation de la « vraie » normale du triangle Apparence

facettisée Vue la plus

réaliste de la vraie géométrie

Foley et al.

Page 107: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

107

Infographie

Pipeline graphique

Pipeline avec z-buffer et ombrage plat Etape « sommets » (input : positions 3D / sommet et

couleur + normale / triangle) Transformation de la position (espace objet → espace œil) Calcul de la couleur (ombrage plat) avec la normale (une couleur

par triangle) Transformation de la position (espace œil → espace écran)

Etape « Rasterisation » Interpolation de z

c (z dans l'espace écran)

Passage de la couleur

Etape « fragments » (output : couleur, zc)

(Ecrire sur les plans couleur et mettre à jour le z-buffer) si zc < z

c

courant

Page 108: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

108

Infographie

Pipeline graphique

Ombrage plat

Page 109: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

109

Infographie

Pipeline graphique

Observateur et illumination locaux vs. lointains Illumination de Phong requiert de l'info géométrique

Vecteur lumière (fonction de la position) Vecteur observateur (fonction de la position) Normale à la surface (obtenu par calcul)

Les vecteurs observateur et lumière changent Ils doivent être calculés et normalisés pour chaque

facette

observateur

lumière

Page 110: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

110

Infographie

Pipeline graphique

Observateur et illumination locaux vs. lointains Cas ou ceux ci sont lointains

Illumination parallèle Projection presque orthographique Dans les deux cas, les vecteur lumière et observateur

changent très peu Une optimisation possible ( et fréquente ) est de les

considérer comme lointains.

Page 111: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

111

Infographie

Pipeline graphique

Lumière directionnelle Le vecteur lumière pointe toujours dans la même

direction

Dans beaucoup de cas, cela accélère le traitement (matériel) de l'illumination

observateur

lumière[ x y z 0 ]

Page 112: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

112

Infographie

Pipeline graphique

Observateur à l'infini Projection orthographique ?

Projection selon un angle constant – modifie la géométrie On peut faire cela aussi pour la projection

perspective, uniquement pour le calcul de l'illumination

Le vecteur observateur est considéré constant (par exemple c'est la normale au plan image)

Produit des résultats bizarres si camera grand angle Ombrage de Blinn-Phong : vecteur observateur, vecteur

source de lumière et vecteur bisecteur (cf cours 4) tous constants

Page 113: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

113

Infographie

Pipeline graphique

Lumière directionnelle + observateur lointain

Seule la normale varie. Cela signifie que la teinte de chaque facette (à normale constante) est constante.

observateur

lumière[ x y z 0 ]

[ xo yo zo 0]

Page 114: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

114

Infographie

Pipeline graphique

Interpolation de Gouraud On veut souvent une apparence lisse, sans pour

autant augmenter la résolution de la discrétisation Se souvenir du mapping : sensibilité aux normales plus

importante que la sensibilité aux positions Idée : couleur calculée aux sommets des facettes Interpolation pour avoir la couleur de chaque pixel

lors de la rasterisation

Page 115: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

115

Infographie

Pipeline graphique

Interpolation de Gouraud

Foley et al.

Page 116: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

116

Infographie

Pipeline graphique

Pipeline avec z-buffer et interpolation de Gouraud

Etape « sommets » (input : positions 3D / sommet et couleur + normale / sommet )

Transformation de la position (espace objet → espace œil) Calcul de la couleur par sommet (peu importe le modèle

d'ombrage...) Transformation de la position (espace œil → espace écran)

Etape « Rasterisation » Interpolation de z

c (z dans l'espace écran), couleur r,g,b

Etape « fragments » (output : couleur, zc)

(Ecrire sur les plans couleur et mettre à jour le z-buffer) si zc < z

c

courant

Page 117: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

117

Infographie

Pipeline graphique

Interpolation de gouraud

Page 118: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

118

Infographie

Pipeline graphique

Interpolation de Gouraud Normales aux sommets

Mathématiquement indéfinies Si la tessellation (triangulation) est obtenue à partir d'une

surface mathématiquement lisse (sphère, NURBS, etc..), on peut prendre la normale à la vraie surface en ce point

Si on n'y a pas accès, on doit trouver une approximation Schéma simple : moyenner les normales des triangles adjacents

N s=

∑i

N i

∥∑i

N i∥N s

N 1

N 2

N 3N 4

N 5

Page 119: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

119

Infographie

Pipeline graphique

Interpolation de Gouraud On peut l'appliquer à n'importe quel modèle

d'illumination Diffuse Blinn-Phong Etc ...

Toutefois, pour les modèles spéculaires cela ne fonctionne pas bien

Variations trop brusques de la luminosité (si le point spéculaire est de taille très inférieure à un triangle)

Page 120: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

120

Infographie

Pipeline graphique

Ombrage de Blinn et interpolation de Gouraud

Foley et al.

Page 121: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

121

Infographie

Pipeline graphique

Interpolation de Phong Consiste en l'interpolation des normales

Aussi facile que l'interpolation des couleurs Mais on calcule le modèle d'illumination à chaque pixel

plutôt que à chaque sommet (après renormalisation des normales)

Dans le pipeline graphique, cela signifie que l'on déplace le traitement de l'illumination depuis l'étape « traitement des sommets » vers l'étape « traitement des fragments »

Page 122: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

122

Infographie

Pipeline graphique

Pipeline

Flux de commandes

Géométrie transformée

Fragments ( ~ pixels + données interpolées )

Mémoire de trame (framebuffer)

Application

Opérations sur les sommets (vertex processing)

Rastérisation

Opérations sur les fragments (fragment processing)

Affichage

On est ici

Transformations 3D, ombrage

Composition, mélange, ombrage,

Ce que l'utilisateur voit

Standards « langage »OpenGL, etc...

Conversion des primitives en

fragments

Page 123: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

123

Infographie

Pipeline graphique

Pipeline avec z-buffer et interpolation de Phong Etape « sommets » (input : positions 3D / sommet et

couleur + normale / sommet ) Transformation de la position (espace objet → espace œil) Transformation de la position (espace œil → espace écran) Passage de la couleur

Etape « Rasterisation » Interpolation de z

c (z dans l'espace écran), couleur r,g,b,

normale x,y,z

Etape « fragments » (output : couleur, zc)

Calcul de l'ombrage en utilisant la couleur et la normale interpolées

(Ecrire sur les plans couleur et mettre à jour le z-buffer) si zc < z

c

courant

Page 124: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

124

Infographie

Pipeline graphique

Interpolation de Phong

Page 125: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

125

Infographie

Pipeline graphique

OpenGL Certains modèles d'ombrage et d'interpolation font

partie du standard (typiquement : Phong, Lambert, Gouraud, Blinn-Phong …), il n'y a rien à faire .

Pour les autres, il existe une API permettant de coder d'autres modèles

soit au niveau du « vertex shader » (traitement au niveau des sommets),

Soit au niveau du « fragment shader » (traitement après la rasterisation, pixel par pixel)

Les cartes graphiques récentes permettent de réellement programmer (en langage pseudo C) le « vertex shader » ou le « fragment shader » (P.ex. Nvidia CUDA , OpenCL)

Page 126: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

126

Infographie

Pipeline graphique

Programmable !

Non / peuprogrammable

Page 127: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

127

Infographie

GPGPU

GPGPU Utilisation des capacités de calcul des GPU pour

effectuer autre chose que du rendu graphique... Les GPUs récents sont relativement polyvalents

(mais moins que les CPUs) Branchements possibles Accès mémoire aléatoire Mais ils restent faits pour les opérations vectorielles

Existence de standards de fait Open Computing Language (OpenCL, ouvert) Common Unified Device Architecture (CUDA, Nvidia) Direct Compute (Microsoft)

Page 128: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

128

Infographie

GPGPU

OpenCL – langage similaire au C Programme hôte en C++ (par exemple) Le code OpenCL est sous forme d'une chaîne de

caractères (char[] ou string ) Le code OpenCL est compilé par le « driver » de la

carte graphique, et chargé sur le GPU par l'appel de fonctions spécifiques

Pour l'utilisation, le programme hôte lui passe des paramètres par tableaux en mémoire principale

Le calcul est effectué sur le GPU Le résultat est rendu au programme hôte,

également en mémoire principale

Page 129: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

129

Infographie

GPGPU

Exemple de code OpenCL__kernel void VectorAdd(__global float* c, __global float* a , __global float* b, __constant float *cst{ // Index of the elements to add unsigned int n = get_global_id(0); unsigned int nl = get_local_id(0); unsigned int gsz = get_global_size(0); unsigned int lsz = get_local_size(0); unsigned int gid = get_group_id(0); // do some math from vectors a and b and store in c __private float res; res=0.; int i; for (i=0;i<100;++i) // not a loop over elements of the arrays  { res=a[n]+sin(a[n])+b[n]; if (res>5.5) res=a[n]* (*cst) ; } c[n] = res;}

Page 130: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

130

Infographie

GPGPU

Dans le programme hôte … initialisationstd::string Src ; // programme source (cf slide precedent)

std::vector<cl::Platform> platforms;cl::Platform::get(&platforms);

cl_context_properties properties[] = { CL_CONTEXT_PLATFORM,(cl_context_properties)(platforms[0])(),

0};

cl::Context context(CL_DEVICE_TYPE_ALL, properties);std::vector<cl::Device> devices =

context.getInfo<CL_CONTEXT_DEVICES>();cl::Program::Sources

source(1,std::make_pair(Src.c_str(),Src.size()));

cl::Program program = cl::Program(context, source);

program.build(devices); // compilation !

Page 131: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

131

Infographie

GPGPU

Dans le programme hôte … appelcl::CommandQueue queue(context,devices[0],0,&err);cl::Buffer GPUOutVec(context, CL_MEM_WRITE_ONLY

,sizeof(float)*SIZE, NULL, &err);float cst=1;cl::Buffer GPUVec1(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR

,sizeof(float)*SIZE,HostVec1,&err);cl::Buffer GPUVec2(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR

,sizeof(float)*SIZE,HostVec2,&err);cl::Buffer GPUCst1(context,CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR

,sizeof(float),&cst,&err);cl::Event event1;cl::Kernel kernel(program_, "VectorAdd", &err);kernel.setArg( 0, GPUOutVec);kernel.setArg( 1, GPUVec1);kernel.setArg( 2, GPUVec2);kernel.setArg( 3, GPUCst1);

queue.enqueueNDRangeKernel(kernel,cl::NullRange,cl::NDRange(SIZE_TEST),cl::NullRange,NULL,&event1);

event1.wait();// a ce point, le calcul a ete fait.

Page 132: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

132

Infographie

GPGPU

Dans le programme hôte … collecte

Exemple complet disponible sur le site du cours

// a ce point, le calcul a ete fait.

cl::Event event2;queue.enqueueReadBuffer(GPUOutVec,CL_TRUE,0,

SIZE_TEST*sizeof(float),HostOutVec, NULL, &event2);event2.wait();

// on dispose dans HostOutVec du resultat

for (int Rows = 0; Rows < SIZE_TEST/32; Rows++){

for (int c = 0; c <32; c++) std::cout << HostOutVec[Rows * 32 + c] << " " ; std::cout << std::endl;}

Page 133: Pipeline graphique OpenGL, DirectX etc · 2 Infographie Pipeline graphique Approche complémentaire du ray-tracing Beaucoup de versions Implémentation logicielle, ex. Pixar Renderman

133

Infographie

GPGPU

OpenCL est multiplateforme Le programme précédent peut être compilé sut tout

ordinateur (disposant d'un driver GPGPU) Le code peut même être exécuté sur...CPU. (en

l'absence de carte graphique récente) Il existe de « faux » drivers qui compilent et exécutent le

code OpenCL sur le CPU. Performance : facteur 2 à 100 en faveur du GPU pour

des opérations vectorielles (sur de gros tableaux) Core i7 6 cœurs 3,33 Ghz (très performant) vs. Nvidia Quadro

FX 580 (carte assez peu performante) : 110 s. vs 55 s. Sur une carte spécialisée Nvidia Tesla C2075 : 11 s.