synthèse d’images 3. texture

115
Synthèse d’images Synthèse d’images 3. 3. Texture Texture Licence Pro 2005-2006 Licence Pro 2005-2006 Sébastien THON IUT de l’Université de Provence, site d’Arles Département Informatique

Upload: fabiano-knight

Post on 31-Dec-2015

47 views

Category:

Documents


5 download

DESCRIPTION

Synthèse d’images 3. Texture. Licence Pro 2005-2006 Sébastien THON IUT de l’Université de Provence, site d’Arles Département Informatique. 1. Problématique Modèle de Phong : prise en compte des interactions lumière/matière, mais ce n’est pas suffisant. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Synthèse d’images 3.  Texture

Synthèse d’imagesSynthèse d’images

3.3. Texture Texture

Licence Pro 2005-2006Licence Pro 2005-2006

Sébastien THON

IUT de l’Université de Provence, site d’Arles

Département Informatique

Page 2: Synthèse d’images 3.  Texture

2

1. Problématique

Modèle de Phong : prise en compte des interactions lumière/matière, mais ce n’est pas suffisant.

Manque de réalisme d’une scène n’utilisant que le modèle d’illumination de Phong.

Page 3: Synthèse d’images 3.  Texture

3

Solution : utilisation de textures.

Page 4: Synthèse d’images 3.  Texture

4

Plaquage de textures (« texture mapping »)

Plaquage d’images 1D, 2D ou 3D sur des primitives géométriques.

Objectifs

- Simuler des matériaux (pierre, bois, …)

- Réduire la complexité (nb de polygones) d’objets 3D

- Simulation de surfaces réfléchissantes

- …

Page 5: Synthèse d’images 3.  Texture

5

Exemple : « Skybox »

Simule un ciel (sky) avec un cube (box) sur les 6 faces internes duquel on plaque des textures. L’observateur reste toujours au centre du cube. Très utilisé dans les jeux (Quake, Half-Life, Call of Duty, …)

Page 6: Synthèse d’images 3.  Texture

6

Exemple : plaquages plus complexes

On utilise souvent un logiciel de modélisation 3D (3DS Max, Maya, etc.), qui calculera automatiquement les coordonnées de texture selon un mode de projection de la texture sur l’objet (ici, projection sphérique).

Plaquage de texture

Texture utilisée

Page 7: Synthèse d’images 3.  Texture

7

2. Principe du plaquage de texture

x

y

z

Espace de la texture

Espace géometriqueEcran

s

t

00

1

1

Page 8: Synthèse d’images 3.  Texture

8

Les textures sont des images qui peuvent être en 1D, 2D, 3D ou 4D. Les coordonnées de l’image sont notées s, t, r, q.

Ex: pour une texture 2D, un point dans l’image est donné par ses coordonnées (s,t), le coin supérieur gauche étant (0,0) et le coin inférieur droit étant (1,1).

s

t

00

1

1

Page 9: Synthèse d’images 3.  Texture

9

Notes :

- Un pixel d’une texture est appelé texel.

- Dans OpenGL, les dimensions de la texture doivent être une puissance de 2 (ce ne sera plus le cas dans OpenGL 2.0).

- Les dimensions des textures sont limitées (dépend des cartes graphiques).

Page 10: Synthèse d’images 3.  Texture

10

Notes :

- On regroupe souvent les textures d’un même objet dans une seule image accélère l’affichage en évitant de changer de texture.

Page 11: Synthèse d’images 3.  Texture

11

3. Utilisation des textures dans OpenGL

3 étapes :

1. Spécifier la texture

1.1 Lire ou générer une image

1.2 En faire une texture

1.3 Activer le plaquage de texture

2. Assigner les coordonnées de texture aux points de l’objet 3D

3. Spécifier les paramètres de textures

• Wraping, filtering, …

Page 12: Synthèse d’images 3.  Texture

12

3.1 Spécifier la texture

3.1.1 Lire ou générer une image

BYTE *img;

int largeur, hauteur;

GLuint texture;

glGenTextures(1, &texture);

img = load_tga( "image.tga", &largeur, &hauteur );

Page 13: Synthèse d’images 3.  Texture

13

Explication:

Dans OpenGL, chaque texture est référencée par un indice (entier). Pour obtenir ces indices, on utilise la fonction :

glGenTextures(GLuint n, GLuint *tab_text);

Qui crée n indices de textures et les place dans le tableau d’entiers tab_text.

Page 14: Synthèse d’images 3.  Texture

14

Ex: obtention d’un ensemble d’indices pour 10 textures ( tableau de 10 indices) :

GLuint tab_text[10]; glGenTextures(10, tab_text);

On peut aussi utiliser cette fonction pour ne demander qu’un seul indice :

Ex: obtention d’un indice pour une seule texture ( une seule variable entière) :

GLuint texture; glGenTextures(1, &texture);

Page 15: Synthèse d’images 3.  Texture

15

3.1.2 En faire une texture

Les textures doivent être stockées dans la RAM de la carte graphique.

Lorsqu’on charge une image pour en faire une texture, il faut ensuite la transférer dans la RAM vidéo.

glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D( GL_TEXTURE_2D, 0, 3,

largeur, hauteur,

0, GL_RGB, GL_UNSIGNED_BYTE, img);

Page 16: Synthèse d’images 3.  Texture

16

Explication:

glTexImage2D( target, level, components, w, h,

border, format, type, *texels );

target : GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D

level : 0 sans mip-mapping

components : nombre d’éléments par texel

w, h : dimensions de la texture (puissances de 2)

border : bordure supplémentaire autour de l’image

format : GL_RGB, GL_RGBA, ...

type : type des éléments des texels

texels : tableau de texels

Page 17: Synthèse d’images 3.  Texture

17

La fonction glBindTexture() permet de définir l’indice de la texture courante.

Cette texture sera utilisée pour toutes les opérations (plaquage, modification de paramètres, …) jusqu’au prochain appel de glBindTexture().

Page 18: Synthèse d’images 3.  Texture

18

3.1.3 Activer le plaquage de texture

glEnable(GL_TEXTURE_2D);

On peut aussi désactiver le plaquage :

glDisable(GL_TEXTURE_2D);

Page 19: Synthèse d’images 3.  Texture

19

3.2 Assigner les coordonnées de texture aux points de l’objet 3D

Pour plaquer une texture sur un objet géométrique, fournir les coordonnées de texture (normalisés entre 0 et 1).

s

t (1, 0)(0,

0)

(0, 1)

(1, 1)

(s, t) = (0.3, 0.2)

(0.4, 0.8)

(0.8, 0.6)

A

B C

a

bc

Espace de la texture Espace de l’objet

Page 20: Synthèse d’images 3.  Texture

20

glBindTexture(GL_TEXTURE_2D, texture);

glBegin(GL_TRIANGLES);

glTexCoord2f(0.0f,0.0f);

glVertex3f(4.0f, 5.0f, 0.0f);

glTexCoord2f(1.0f,0.0f);

glVertex3f(10.0f, 5.0f, 0.0f);

glTexCoord2f(0.0f,1.0f);

glVertex3f(4.0f, 12.0f, 0.0f);

glEnd();

Page 21: Synthèse d’images 3.  Texture

21

3.3 Paramètres de textures

Modes de filtrage

• Réduction, agrandissement

• Mip-mapping

Modes de bouclage

• Répéter, tronquer

Fonctions de textures

• Comment mélanger la couleur d’un objet avec sa texture

Page 22: Synthèse d’images 3.  Texture

22

3.3.1 Modes de filtrage

• Réduction, agrandissement

Les textures et les objets texturés ont rarement la même taille (en pixels). OpenGL défini des filtres indiquant comment un texel doit être agrandit ou réduit pour correspondre à la taille d’un pixel.

Texture Polygone

AgrandissementGL_TEXTURE_MAG_FILTER

RéductionGL_TEXTURE_MIN_FILTER

PolygoneTexture

Page 23: Synthèse d’images 3.  Texture

23

glTexParameteri(target, type, mode);

Avec :

target : GL_TEXTURE_2D, ...

type : GL_TEXTURE_MIN_FILTER,

GL_TEXTURE_MAG_FILTER

mode : GL_NEAREST, GL_LINEAR

GL_NEAREST : la couleur du pixel est donnée par celle du texel le plus proche.

GL_LINEAR : la couleur du pixel est calculée par interpolation linéaire des texels les plus proches.

Page 24: Synthèse d’images 3.  Texture

24

GL_NEAREST GL_LINEAR

Page 25: Synthèse d’images 3.  Texture

25

Ex:

glBindTexture(GL_TEXTURE_2D, texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Page 26: Synthèse d’images 3.  Texture

26

• Mip-mapping

Problème d’aliassage :

Page 27: Synthèse d’images 3.  Texture

27

Solution : La technique de mip-mapping consiste en un précalcul de plusieurs versions réduites d’une même texture.

256 x 256

128 x 128

64 x 64

32 x 32

Dimensions : puissances de 2 (min : 1x1 texel)

Approche le mécanisme de vision humaine : adapte le niveau de détails en fonction de la distance.

16 x 168 x 8

Page 28: Synthèse d’images 3.  Texture

28

Permet de réduire les problèmes d’aliassage.

Sans mip-mapping Avec mip-mapping

Page 29: Synthèse d’images 3.  Texture

29

Création des textures de mip-mapping

1) Manuelle

On déclare le niveau de mip-map lors de la définition de la texture :

glTexImage2D( target, level, components, width, height, border, format, type, *texels );

Page 30: Synthèse d’images 3.  Texture

30

2) Automatique

On utilise une fonction de OpenGL qui construit automati-quement les différentes textures de mip-map.

gluBuild2DMipmaps( GL_TEXTURE_2D, components, width, height, format, type, *texels );

Page 31: Synthèse d’images 3.  Texture

31

Dans les deux cas, il faut ensuite indiquer le mode de filtrage de la texture en indiquant qu’on veut s’en servir en tant que mip-map :

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, img);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);

Page 32: Synthèse d’images 3.  Texture

32

3.3.2 Modes de bouclage (Wrap)

Ce mode indique ce qui doit se produire si une coordonnée de texture sort de l’intervalle [0,1].

Deux possibilités :

• Répéter (« Repeat »)

• Tronquer (« Clamp »)

Page 33: Synthèse d’images 3.  Texture

33

- Répéter

Si le mode GL_REPEAT est utilisé, pour les coordonnées <0 ou >1, la partie entière est ignorée et seule la partie décimale est utilisée.

glTexParameteri( GL_TEXTURE_2D,

GL_TEXTURE_WRAP_S,

GL_REPEAT );

texture

s

t

GL_REPEAT

Page 34: Synthèse d’images 3.  Texture

34

Exemple : Répétition d’une texture en mode GL_REPEAT.

Il faut créer une texture de telle sorte qu’elle boucle naturellement (ici, selon les 2 axes), sans qu’on voit les bords.

Page 35: Synthèse d’images 3.  Texture

35

- Tronquer

Si le mode GL_CLAMP est utilisé, la valeur de la texture aux extrêmes (0 ou 1) est utilisée.

glTexParameteri( GL_TEXTURE_2D,

GL_TEXTURE_WRAP_S,

GL_CLAMP );

texture

s

t

GL_CLAMP

Page 36: Synthèse d’images 3.  Texture

36

3.3.3 Fonctions de textures

Contrôle la manière selon laquelle la texture est mélangée à la couleur de l’objet.

glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, param );

param peut prendre l’une des valeurs suivantes :

• GL_DECAL : remplace la couleur par le texel.

• GL_MODULATE : multiplie le texel par la couleur.

Page 37: Synthèse d’images 3.  Texture

37

GL_DECALRemplace la couleur donnée par l’illumination de Phong par celle du texel.

glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

GL_MODULATEMultiplie la couleur donnée par l’illumination de Phong par celle du texel.

glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

résultats plus réalistes

Page 38: Synthèse d’images 3.  Texture

38

Exemple complet de lecture d’une texture RGB et de son application sur un triangle

// Déclarations de variables

BYTE *img;

int largeur, hauteur;

Gluint texture;

// Fin des déclarations de variables

Page 39: Synthèse d’images 3.  Texture

39

// Création d’une texture// - lecture d’une image// - chargement en mémoire vidéo// - réglage des paramètres de la texture

glGenTextures(1, &texture);

img = load_tga( "image.tga", &largeur, &hauteur );

if( img != NULL )

{

glBindTexture(GL_TEXTURE_2D, texture);

glTexImage2D( GL_TEXTURE_2D, 0, 3,

largeur, hauteur,

0, GL_RGB, GL_UNSIGNED_BYTE, img);

delete[] img;

}

Page 40: Synthèse d’images 3.  Texture

40

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

// Fin de la création d’une texture

Page 41: Synthèse d’images 3.  Texture

41

// Utilisation d’une texture

// Si le mode "texture" avait été désactivé,// on l’active :

glEnable(GL_TEXTURE_2D);

glBegin(GL_TRIANGLES);

glTexCoord2f(0.0f,0.0f);

glVertex3f(4.0f, 5.0f, 0.0f);

glTexCoord2f(1.0f,0.0f);

glVertex3f(10.0f, 5.0f, 0.0f);

glTexCoord2f(0.0f,1.0f);

glVertex3f(4.0f, 12.0f, 0.0f);

glEnd();

// Fin de l’utilisation d’une texture

Page 42: Synthèse d’images 3.  Texture

42

Exemple complet de lecture d’une texture RGB et de son application en mip-mapping sur un triangle

// Déclarations de variables

BYTE *img;

int largeur, hauteur;

GLuint texture;

// Fin des déclarations de variables

Page 43: Synthèse d’images 3.  Texture

43

// Création d’une texture mip-map// - lecture d’une image// - chargement en mémoire vidéo en tant que mip-map// - réglage des paramètres de la texture

glGenTextures(1, &texture);

img = load_tga( "image.tga", &largeur, &hauteur );

glBindTexture(GL_TEXTURE_2D, texture);

gluBuild2DMipmaps(GL_TEXTURE_2D, 3,

largeur, hauteur,

GL_RGB, GL_UNSIGNED_BYTE, img);

Page 44: Synthèse d’images 3.  Texture

44

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

// Fin de la création d’une texture mip-map

Page 45: Synthèse d’images 3.  Texture

45

// Utilisation d’une texture

// Si le mode "texture" avait été désactivé,// on l’active :

glEnable(GL_TEXTURE_2D);

glBegin(GL_TRIANGLES);

glTexCoord2f(0.0f,0.0f);

glVertex3f(4.0f, 5.0f, 0.0f);

glTexCoord2f(1.0f,0.0f);

glVertex3f(10.0f, 5.0f, 0.0f);

glTexCoord2f(0.0f,1.0f);

glVertex3f(4.0f, 12.0f, 0.0f);

glEnd();

// Fin de l’utilisation d’une texture

Page 46: Synthèse d’images 3.  Texture

46

4. Fonctions OpenGL avancées

• Modification d’une texture

• Gestion de textures en mémoire

• Alpha-Blending

• Multitexturing

• Environment mapping

• Bump mapping

• Environment mapping

• Textures compressées

Page 47: Synthèse d’images 3.  Texture

47

4.1 Modification d’une texture

Il est possible de modifier tout ou partie d’une texture. Évite d’avoir à recréer une nouvelle texture.

Exemple :

on veut modéliser une TV avec un cube, en plaquant sur une de ses faces une texture dont on modifie le contenu au cours du temps avec les images d’un film.

Page 48: Synthèse d’images 3.  Texture

48

void glTexSubImage2D( GLenum target, GLint level,

GLint x, GLint y,

GLint w, GLint h,

GLenum format, GLenum type,

GLvoid *texels );

target : GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D

level : 0 sans mip-mapping

x, y : coordonnées de la sous-région à modifier

w, h : dimensions de la sous-région de la texture

format : GL_RGB, GL_RGBA, ...

type : type des éléments des texels (GL_UNSIGNED_BYTE)

texels : tableau de texels source

Page 49: Synthèse d’images 3.  Texture

49

4.2 Gestion de textures en mémoire

Les textures sont chargées en mémoire vidéo. Quand il n’y a plus de place, OpenGL supprime des textures.

4.2.1 Vérification de validité

On peut savoir si un entier correspond à un identificateur valide de texture :

GLboolean glIsTexture (GLuint texture);

Retourne GL_TRUE ou GL_FALSE.

Page 50: Synthèse d’images 3.  Texture

50

4.2.2 Vérification de présence

On peut savoir si une texture est résidente en mémoire :

GLboolean glAreTexturesResident(

GLsizei n,

Gluint *texNums,

GLboolean *residences);

n : nombre de textures.

texNums : tableau des identificateurs des textures.

Residences : tableau de booléens indiquant si les textures correspondantes de texNums sont résidentes ou non.

Si toutes les textures sont résidentes, la fonction retourne TRUE, sinon FALSE.

Page 51: Synthèse d’images 3.  Texture

51

4.2.3 Ordre de priorité

On peut spécifier un ordre de priorité entre 0 et 1 pour chaque texture. Les textures d’ordre les plus faibles seront les premières supprimées.

glPrioritizeTextures(

GLsizei n,

GLuint *texNums,

GLclampf *priorities);

n : nombre de textures.

texNums : tableau des identificateurs des textures.

Residences : tableau de réels indiquant l’ordre de priorité des textures correspondantes de texNums.

Page 52: Synthèse d’images 3.  Texture

52

4.2.4 Suppression de textures

Lorsque des textures sont inutilisées, on peut les supprimer de la mémoire vidéo avec la fonction :

glDeleteTextures(Gluint n, Gluint *tab_text);

Où tab_text est un tableau contenant les n identificateurs des textures à supprimer.

Page 53: Synthèse d’images 3.  Texture

53

4.3 Alpha blending

4.3.1 La composante Alpha

La composante alpha (4ème valeur, se rajoute à R,G,B) pour une couleur est une mesure de son opacité. Sa valeur va de 0.0 (complètement transparent) à 1.0 (complètement opaque).

Simulation d’objets translucides (eau, fumée, …)

Mélange d’images

Page 54: Synthèse d’images 3.  Texture

54

On peut utiliser comme textures semi-transparentes des images 32 bits RGBA (formats : TGA, BMP, …)

Il y a deux comportements possibles :

- Transparence (GL_ALPHA_TEST)

- Translucidité (GL_BLEND)

Page 55: Synthèse d’images 3.  Texture

55

4.3.2 Transparence (GL_ALPHA_TEST)

Les pixels seront affichés ou non ( comportement binaire) en fonction de la valeur de leur composante alpha et du mode spécifié par glAlphaFunc() :

glAlphaFunc(mode, valeur);

Teste la composante alpha de chaque pixel à afficher par rapport à valeur selon mode. Si le test échoue, le pixel ne sera pas affiché.

Valeurs possibles de mode :GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER,GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS

La valeur par défaut est GL_ALWAYS : tous les pixels sont affichés.

Page 56: Synthèse d’images 3.  Texture

56

Exemple :

glAlphaFunc(GL_GREATER, 0);

glEnable(GL_ALPHA_TEST); // Affichage des polygones texturés// avec la texture RGBA

 glDisable(GL_ALPHA_TEST);

Les polygones affichés auront des trous là où les texels de leur texture n’ont pas de composante alpha > 0.

Page 57: Synthèse d’images 3.  Texture

57

Remarque :

Technique très utilisée pour afficher des arbres dans des jeux ou des simulateurs :

Plutôt que d’afficher un arbre modélisé en 3D avec des milliers de triangles ( lent à afficher, surtout pour toute une forêt), on utilise un ou deux quadrilatères sur lesquels on plaque une texture d’arbre.

Page 58: Synthèse d’images 3.  Texture

58

Page 59: Synthèse d’images 3.  Texture

59

Billboarding

Orientation du quadrilatère face à l’observateur.

Orientation cylindrique

Orientation sphérique

Orientation initiale

http://www.lighthouse3d.com/opengl/billboarding/

Page 60: Synthèse d’images 3.  Texture

60

Pour représenter un arbre dans un jeu, on utilise généralement plusieurs billboards.

Le nombre de billboards dépend de la distance à laquelle l’arbre est vu.

http://www.bionatics.fr

Page 61: Synthèse d’images 3.  Texture

61

4.3.3 Translucidité (GL_BLEND)

La couleur de la texture se mélange à la couleur du reste de la scène dans des proportions données par la valeur alpha de chaque texel de la texture.

La manière de mélanger est définie par la fonction :

glBlendFunc(GL_SRC_ALPHA, mode);

Le mode le plus utilisé est GL_ONE_MINUS_SRC_ALPHA .

Page 62: Synthèse d’images 3.  Texture

62

Exemple :

glBlendFunc(GL_SRC_ALPHA,

GL_ONE_MINUS_SRC_ALPHA);

glEnable(GL_BLEND); 

// Affichage des polygones// texturés avec la texture RGBA

 glDisable(GL_BLEND);

Les polygones affichés seront plus ou moins translucides.

Page 63: Synthèse d’images 3.  Texture

63

Remarque :

Technique très utilisée pour réaliser des effets de fumée, de flamme, d’explosion, de lumière, des nuages, etc. en plaquant une texture translucide sur un quadrilatère.

Page 64: Synthèse d’images 3.  Texture

64

Page 65: Synthèse d’images 3.  Texture

65

Page 66: Synthèse d’images 3.  Texture

66

4.4 Multi-texturing

Les cartes graphiques disposent de plusieurs « unités de texture », ce qui permet d’appliquer plusieurs textures sur un même polygone, en combinant ces textures selon différentes opérations.

Ces nouvelles fonctionnalités sont disponibles dans OpenGL sous la forme d’extensions.

Texture 0Environment

CouleurTexture 0

Couleur de base

Texture 1Environment

CouleurTexture 1

… Couleur résultante

Page 67: Synthèse d’images 3.  Texture

67

Application : « lightmaps »

Los de l’affichage, mélange de la texture avec une texture stockant une illumination précalculée pour obtenir une texture éclairée. Permet de simuler plus de sources de lumière (OpenGL limité à 8 sources) ou des ombres portées.

Technique très utilisée dans les jeux depuis Quake.

Page 68: Synthèse d’images 3.  Texture

68

X =

LightmapTexture de base Multitexturing

X =

Agrandie en 256x256

Lightmap 16 x 16

- Les lightmaps nécessitent de très faibles résolutions.- Lightmap : seulement luminance ( un seul octet par texel).- Pas la peine d’avoir plusieurs versions éclairées différem-

ment de la même texture de base.

Page 69: Synthèse d’images 3.  Texture

Les lightmaps sont souvent précalculées avec une méthode de radiosité (illumination globale).

Son principe : décomposer les surfaces de la scène 3D en carreaux (« patchs »). Certains carreaux correspondant aux sources de lumière ont une intensité lumineuse. On calcule ensuite les échanges lumineux entre les carreaux.

Découpage en carreaux Calcul des échanges de lumière entre les carreaux

Page 70: Synthèse d’images 3.  Texture

70

Page 71: Synthèse d’images 3.  Texture

71

Artefact : effet d’escalier

L’agrandissement exagéré des textures de lightmap rend très apparents les texels, surtout sur les bords des ombres

effets de marches d’escalier.

Page 72: Synthèse d’images 3.  Texture

72

Exemple d’application de deux textures sur un triangle :

// INITIALISATION DE LA 1ERE UNITE DE TEXTURE

// On active l’unité de texture souhaitée : glActiveTextureARB(GL_TEXTURE0_ARB);

// On permet l’utilisation de textures pour l’unité activée : glEnable(GL_TEXTURE_2D);

// On spécifie la texture à utiliser pour l’unité activée : glBindTexture(ident_texture1);

// On spécifie la fonction de mélange entre la texture de// cette unité et la couleur actuelle du pixel à texturer : glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

Page 73: Synthèse d’images 3.  Texture

73

// INITIALISATION DE LA 2EME UNITE DE TEXTURE

 // On active l’unité de texture souhaitée : glActiveTextureARB(GL_TEXTURE1_ARB);

// On permet l’utilisation de textures pour l’unité activée :glEnable(GL_TEXTURE_2D);

// On spécifie la texture à utiliser pour l’unité activée :glBindTexture(ident_texture2);

// On spécifie la fonction de mélange entre la texture de// cette unité et la couleur actuelle du pixel à texturer : glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

Page 74: Synthèse d’images 3.  Texture

74

// Au lieu de la fonction glTexCoord2f, on spécifie les coordonnées

// de texture pour chaque unité de texture avec :

// glMultiTexCoord2fARB( GL_TEXTUREn_ARB, s, t );

// où n est le numéro de l’unité, s et t sont les coordonnées

// de texture.

glBegin(GL_TRIANGLES);

glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0, 1.0);

glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.4, 0.8);

glVertex3f(-4,0,0);

 

glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0, 1.0);

glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.9, 0.8);

glVertex3f(4,0,0);

 

glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.5, 0.0);

glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.7, 0.2);

glVertex3f(0,10,0);

glEnd() ;

Page 75: Synthèse d’images 3.  Texture

75

// Après avoir utilisé le multitexturing pour un objet, on

// peut désactiver les unités de texture non nécessaires pour

// les objets à afficher suivants.

glActiveTextureARB(GL_TEXTURE0_ARB);

glDisable(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1_ARB);

glDisable(GL_TEXTURE_2D);

Page 76: Synthèse d’images 3.  Texture

76

4.5 Environment mapping

Permet de simuler des surfaces réfléchissantes (chrome, métal, …) au moyen d’un plaquage de texture.

Page 77: Synthèse d’images 3.  Texture

77

Principe

Les coordonnées de texture de l’objet réfléchissant sont calculées dans une texture représentant l’environnement selon la position de l’observateur.

Plusieurs méthodes intégrées dans les cartes graphiques :

• Sphere mapping

• Cube mapping

• …

Page 78: Synthèse d’images 3.  Texture

78

Sphere mapping

Utilisation d’une texture représentant une sphère parfaitement réfléchissante.

Pour chaque sommet de l’objet 3D à texturer, on calcule ses coordonnées de texture (xt,yt) à partir de la normale (x,y,z) en ce sommet.

Texture d’environnement

Page 79: Synthèse d’images 3.  Texture

79

Exemple de sphere mapping

// A faire une seule fois (initialisation)glTexGenfv(GL_S, GL_SPHERE_MAP, 0);  glTexGenfv(GL_T, GL_SPHERE_MAP, 0); 

// Activer la génération de coordonnées de textureglEnable(GL_TEXTURE_GEN_S);  glEnable(GL_TEXTURE_GEN_T);

// Afficher l’objet recevant l’environment mapping// ...

// Désactiver la génération de coordonnées de textureglDisable(GL_TEXTURE_GEN_S);  glDisable(GL_TEXTURE_GEN_T);

Page 80: Synthèse d’images 3.  Texture

80

Cube mapping

L’objet à texturer se trouve dans un cube dont les 6 faces ont des textures correspondant au monde environnant l’objet.

Donne de meilleurs résultats que le sphere mapping, mais est plus coûteux (6 images au lieu d’une seule).

Page 81: Synthèse d’images 3.  Texture

81

4.6 Bump mapping

Permet de simuler une géométrie complexe à partir d’une simple surface dont on modifie l’orientation de la normale, selon les orientations des normales de la surface à simuler.

Surface simple

Véritable géométrie à simuler

Surface simple avec bump-mapping

Page 82: Synthèse d’images 3.  Texture

82

Sans bump-mapping Avec bump-mapping

Ces deux objets ont exactement la même géométrie, le même nombre de polygones, seule leur illumination est différente.

Perturbation des normales avec une texture de bump-map

Page 83: Synthèse d’images 3.  Texture

83

En pratique

Pour chaque pixel à afficher, on veut modifier la normale N utilisée (le calcul de l’illumination se fait pour chaque pixel). On utilise une image en niveaux de gris pour calculer une normale Nb qui sera rajoutée à la normale N pour la perturber.L’image en niveaux de gris est une carte de hauteurs. A partir de 3 pixels, on détermine la direction du vecteur Nb (produit vectoriel).

Carte de hauteurs utilisée pour faire du bump mapping

Nb

Page 84: Synthèse d’images 3.  Texture

Plusieurs techniques de bump mapping sont apparues dans les cartes graphiques, plus où moins rigoureuses (et donc plus ou moins coûteuses en temps de clacul) :

Maintenant, on calcule le bump mapping grâce aux shaders.

Emboss bump mapping

Dot product bump mapping

Page 85: Synthèse d’images 3.  Texture

4.7 « Normal maps »

Technique de stockage des normales d’une surface dans une texture, utilisée selon un principe de bump-mapping.

La différence par rapport au bump mapping est que ce sont des images en couleur 24 bits qui sont utilisées ( 3x plus de place) : les composantes (R,V,B) des pixels servent à coder les composantes (x,y,z) des normales.

Normal mapProjection de la géométrieGéométrie 3D

Page 86: Synthèse d’images 3.  Texture

86

Exemple d’applicationPartir d’un modèle 3D très détaillé, en calculer les normales et les encoder dans une texture de normal map.Utiliser ensuite cette normal map sur une version plus grossière du modèle 3D.(Astuce utilisée dans Doom 3, Half-Life 2, …)

Page 87: Synthèse d’images 3.  Texture

87

4.8 Displacement mapping

Augmente la complexité (niveau de détails) d’une surface en générant des données géométriques à partir de textures. Contrairement au bump mapping, la surface est réellement modifiée.Fonctionnalité supportée par les cartes graphiques.

Page 88: Synthèse d’images 3.  Texture

88

4.9 Textures procédurales

La couleur d’une texture est donnée par une fonctionEn 2D : f(x,y). En 3D : f(x,y,z).Textures de bois, de marbre, etc.

Ex: texture procédurale 2D de damier :

RGB texture_damier( int x, int y ){ if( (x+y)%2 == 0 ) return RGB(0,0,0); else return RGB(255,255,255);}

Page 89: Synthèse d’images 3.  Texture

89

4.10 Textures 3D

La couleur en un point 3D de l’objet est donnée par une matrice 3D de texels

L’objet est « sculpté » dans cette matière. Permet d’éviter les problème de plaquage et de

raccord des textures 2D.

Texture 2D Texture 3D

Page 90: Synthèse d’images 3.  Texture

90

Mais les textures 3D sont très coûteuses en mémoire.

Textures 3D procédurales

La couleur en un point 3D de l’objet est donnée par une fonction f(x,y,z)

Textures de bois, de marbre, de pierre, etc.

Page 91: Synthèse d’images 3.  Texture

91

Les textures procédurales sont utilisées dans de nombreux logiciels de synthèse d’images (POV, 3D Studio, …)

Elles peuvent être utilisées avec OpenGL par le biais des Vertex Shaders et des Pixel Shaders, qui offrent des possibilités de programmation avancées des cartes graphiques.

Page 92: Synthèse d’images 3.  Texture

92

Avantages des textures procédurales (2D et 3D)

Ces fonctions nécessitent très peu de mémoire (à peine quelques octets, pour le code de ces fonctions).

Textures 3D: Permet d’éviter les problèmes de plaquage et de raccord des textures 2D.

Inconvénients des textures procédurales (2D et 3D)

Le calcul de la couleur en un point peut être long (dépend de la complexité de la fonction).

La détermination des paramètres de ces fonctions n’est pas facile (peu intuitif).

Page 93: Synthèse d’images 3.  Texture

93

Fonction de bruit de Perlin

« Perlin noise », inventé par Ken Perlin en 1985.

Fonction (1D, 2D, 3D) générant des nombres pseudo-aléatoires (=« bruit »).

Bruit de Perlin 1D

Valeurs pseudo-aléatoires à des positions régulières

Valeur à une position quelconque obtenue par interpolation

Amplitude

Code source original disponible sur :http://mrl.nyu.edu/~perlin/doc/oscar.html#noise

Page 94: Synthèse d’images 3.  Texture

94

Des valeurs pseudo-aléatoires obtenues à partir d'une table précalculée sont tout d'abord assignées à chaque point de l'espace ayant des coordonnées entières, formant une grille régulière de points entiers.

La valeur de la fonction de bruit en un point quelconque de l'espace ne se trouvant pas sur la grille régulière est obtenue par interpolation des points de la grille voisins.

L'intérêt de cette fonction est qu'elle permet d'obtenir une valeur aléatoire pour un point quelconque de l'espace, et que cette valeur reste toujours la même pour le même point.

On peut donc utiliser une fonction de bruit 2D pour générer les altitudes d'un terrain infini, sachant que si on revient sur nos pas on retrouvera exactement le même relief.

Page 95: Synthèse d’images 3.  Texture

95

Bruit de Perlin 2D

Turbulence de Perlin 2D

freq = 0.01 freq = 0.02 freq = 0.04 freq = 0.08

Il s'agit tout simplement d'une somme de plusieurs fonctions de bruit ayant différentes échelles. Le nombre de fonctions est désigné par le terme de "nombre d'octaves".

nb octaves=1 nb octaves=2 nb octaves=4 nb octaves=8

Page 96: Synthèse d’images 3.  Texture

96

Technique également utilisée pour créer des cartes d'altitudes dans de nombreux logiciels de création de paysages de synthèse (Bryce, Terragen, Vue d'Esprit, ...) car une image 2D générée avec la fonction de Perlin évoque un paysage montagneux vu de haut.

Page 97: Synthèse d’images 3.  Texture

97

Technique très utilisée dans toutes sortes de logiciels de dessin ou de synthèse pour créer des effets de fumée, de brouillard, de nuages, etc.

Ajoute du réalisme en simulant des imperfections.

Plus de renseignements sur :

http://astronomy.swin.edu.au/~pbourke/texture/perlin/

http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

Page 98: Synthèse d’images 3.  Texture

98

4.11 Compression de textures

4.11.1 Problématique

Les applications 3D (ex: jeux, …) nécessitent des textures de plus en plus fines.

Consommateur d’espace mémoire.Ex: texture RGB de 1024x1024 = 3 Mo

Gestion de textures compressées par les cartes graphiques :

S3TC (S3) DXTC (Microsoft), basé sur S3TC

Page 99: Synthèse d’images 3.  Texture

99

4.11.2 Le format DXTC

DXTC = 5 formats de compression avec perte.

La texture est décomposée en blocs de 16 pixels (4 pixels sur 4). Chaque bloc est compressé et décompressé indépendamment des autres.

Nom Type Taux de compression

DXT1 RGB 8:1

DXT2 RGBA 4:1

DXT3 RGBA 4:1

DXT4 RGBA 4:1

DXT5 RGBA 4:1

Page 100: Synthèse d’images 3.  Texture

100

4.11.3 Utilisation

Deux possibilités :

• Fournir une image non compressée à la carte graphique, qui se chargera de la compresser.

• Utiliser une image déjà compressée et la fournir à la carte graphique.

Outils de compression disponibles sur le site de NVIDIA :

http://developer.nvidia.com/object/nv_texture_tools.html

+ exemples d’utilisation avec OpenGL.

Page 101: Synthèse d’images 3.  Texture

101

4.12 Stencil buffer

Un stencil buffer est un masque ayant les mêmes dimensions que l’image (color buffer), à laquelle il associe un flag (entier sur 8 bits) pour chaque pixel.

Il permet de préciser les zones de l’image dans lesquelles on peut réaliser l’affichage affichage plus rapide en éliminant certaines zones.

Contrairement au color buffer, le stencil buffer n’est pas directement visible.

Page 102: Synthèse d’images 3.  Texture

102

OpenGL fournit des fonctions pour positionner ces flags, généralement en même temps qu'un premier tracé, et pour les tester au cours des tracés suivants.

Cette fonctionnalité est activée par :

glEnable(GL_STENCIL_TEST);

Elle est désactivée avec :

glDisable(GL_STENCIL_TEST);

Page 103: Synthèse d’images 3.  Texture

103

Exemple :Pour un simulateur de vol, on souhaite ne tracer le cockpit qu'une fois, et ensuite le paysage ne doit être tracé que dans les fenêtres.

1) Dans la fonction où on demandait l’effacement du color buffer et du Z-buffer, on demande aussi l’effacement du stencil buffer :

glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT|

GL_STENCIL_BUFFER_BIT); Color buffer

Stencil buffer

Page 104: Synthèse d’images 3.  Texture

2) On demande alors à OpenGL de toujours mettre à 1 le stencil buffer là où on aura dessiné le cockpit :

glStencilFunc(GL_ALWAYS,1,1); glStencilOp(GL_KEEP,GL_KEEP,GL_REPLACE); // et on affiche le cockpit

3) Puis, pour l’affichage du paysage, on indique qu'il ne faut désormais plus tracer que dans les zones où le stencil est égal à 0 :

glStencilFunc(GL_EQUAL,0,1); glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP); // et on affiche le reste du paysage

Color buffer

Stencil buffer

Color buffer

Page 105: Synthèse d’images 3.  Texture

105

4.13 Rendu non réaliste

Modèles d’illumination (ex: Phong) : cherchent à reproduire la réalité.

Mais l’objectif n’est pas toujours de produire une image la plus photo-réaliste possible.

Page 106: Synthèse d’images 3.  Texture

106

Cell shading

Rendu 3D qui donne à l'affichage un aspect « cartoon ».

Le nombre de couleurs est réduit.

Les objets peuvent être détourés comme sur un celluloïd (« cell ») de dessin animé.

Page 107: Synthèse d’images 3.  Texture

107

Page 108: Synthèse d’images 3.  Texture

108

Technique utilisée

DétourageAfficher une première fois les faces invisibles en noir, en rapprochant très légèrement la caméra, de manière à avoir une silhouette un peu épaissie.

Afficher ensuite normalement l’objet en réduisant les couleurs :

Réduction des couleursUtilisation d’un pixel shader pour calculer un nouveau type d’éclairage, sans passer par le modèle de Phong.

Page 109: Synthèse d’images 3.  Texture

109

4.14 Ombre

L’affichage d’ombres portées est très important pour la perception de l’espace 3D.

Ambiguïté : la balle est-elle posée sur la table ?

L’affichage de l’ombre de la balle permet de lever l’ambiguïté

Page 110: Synthèse d’images 3.  Texture

110

4.14.1 Lancer de rayons

Gestion aisée des ombres. Avant d’afficher un point, pour savoir si il est dans l’ombre, on teste si il y a un objet entre ce point et les sources de lumière.

Pas d’affichage temps réel Pas d’ombres douces

Page 111: Synthèse d’images 3.  Texture

111

4.14.2 Radiosité

Gestion aisée des ombres. Gestion des pénombres.

Pas d’affichage temps réel

Page 112: Synthèse d’images 3.  Texture

112

4.14.3 OpenGL

Pas de test d’occlusion de la lumière les ombres portées ne sont pas prises en compte.

Pas d’ombre projetée par la maison

Page 113: Synthèse d’images 3.  Texture

113

1) Simple plaquage de texture

Pour représenter des ombres simplistes, on peut utiliser le multi-texturing pour plaquer une texture RGBA prédéfinie.

Page 114: Synthèse d’images 3.  Texture

114

2) Shadow volumes

Technique beaucoup plus sophistiquée, permettant de représenter des ombres exactes sur n’importe quel objet.

Technique utilisée dans Doom 3.

Page 115: Synthèse d’images 3.  Texture

115

Principe : calculer le volume d'ombre généré par un objet occultant une source de lumière. Toute surface dans le volume d'ombre n'est pas affectée par l'éclairage de la source lumineuse en question.

http://www.presence-pc.com/article-95-3.htmlhttp://developer.nvidia.com/object/robust_shadow_volumes.html