3.4.5 Les textures modélisées

Les textures modélisées sont des textures complexes faites de multiples textures. Les composants peuvent être des textures ordinaires, ou des textures modélisées. Une texture ordinaire a juste une déclaration de pigment, de normale et de finition. Même un pigment avec un spectre de pigments est toujours un pigment et ainsi est considéré une texture simple, comme le sont les normales avec des déclarations de spectre de normales.

Les textures modélisées utilisent soit une déclaration texture_map pour appeler un mélange, soit un groupement de texture comme le damier avec une liste de textures, soit une bitmap similaire à une application d'image, appelée application de matière spécifiée avec le mot clé material_map.

La syntaxe est...

PATTERNED_TEXTURE:
	texture {
		[PATTERNED_TEXTURE_ID]
		[TRANSFORMATIONS...]
	} |
	texture {
		PATTERN_TYPE
		[TEXTURE_PATTERN_MODIFIERS...]
	} |
	texture {
		tiles TEXTURE tile2 TEXTURE
		[TRANSFORMATIONS...]
	} |
	texture {
		material_map {
			BITMAP_TYPE "bitmap.ext"
			[BITMAP_MODS...] TEXTURE... [TRANSFORMATIONS...]
		}
	}
TEXTURE_PATTERN_MODIFIER:
	PATTERN_MODIFIER | TEXTURE_LIST |
	texture_map { TEXTURE_MAP_BODY }

Il y a des restrictions à l'utilisation des textures modélisées. Elles ne peuvent pas être des textures par défaut (voir la section "La directive #default"). Elles ne peuvent pas être une couche d'une texture en couche, toutefois, vous pouvez utiliser des textures en couche comme composant d'une texture modélisée.

3.4.5.1 Les spectres de textures

En plus de la spécification de couleurs mélangées avec un spectre de couleurs ou de pigments, vous pouvez créer un mélange de textures en utilisant texture_map. La syntaxe pour la description d'un spectre de textures est identique au spectre de pigments, sauf que vous spécifiez une texture à chaque entrée.

La syntaxe pour texture_map est :

TEXTURE_MAP:
	texture_map { TEXTURE_MAP_BODY }
TEXTURE_MAP_BODY:
	TEXTURE_MAP_IDENTIFIER | TEXTURE_MAP_ENTRY...
TEXTURE_MAP_ENTRY:
	[ Value TEXTURE_BODY ]

Value est une valeur numérique entre 0.0 et 1.0, inclus, et chaque TEXTURE_BODY est tout ce qui apparaît normalement dans le corps d'une texture, mais le mot clé texture et les parenthèses {} ne sont pas nécessaires.

Note : les parenthèses [] font partie de TEXTURE_MAP_ENTRY. Ce ne sont pas des symboles de notation pour désigner des parties optionnelles. Les parenthèses entourent chaque entrée de la description.

Il peut y avoir entre 2 et 256 entrées.

Par exemple :

texture {
	gradient x	// ceci est le PATTERN_TYPE
	texture_map {
		[0.3 pigment {Red} finish {phong 1}]
		[0.3 T_Wood11]	// ceci est un identificateur de texture
		[0.6 T_Wood11]
		[0.9 pigment {DMFWood4} finish {Shiny}]
	}
}

Quand la fonction gradient x retourne des valeurs entre 0.0 et 0.3, la texture rouge accentué est utilisée. De 0.3 à 0.6, l'identificateur de texture T_Wood11 est utilisé. De 0.6 à 0.9, un mélange de T_Wood11 et d'un DMFWood4 brillant est utilisé. A partir de 0.9, seul le bois reluisant est utilisé.

Les spectres de texture peuvent être emboîtés jusqu'au niveau de complexité désiré. Les textures dans un spectre peuvent avoir des spectres de couleurs, des spectres de texture, ou tout type de texture désiré.

L'aire de mélange d'un spectre de texture fonctionne par un calcul complet des deux textures concernées, puis par interpolation linéaire des couleurs apparentes. Cela signifie que les calculs de réflexion, de réfraction et d'illumination sont faits deux fois pour chaque point. Cela contraste avec l'utilisation d'un spectre de pigments et d'un spectre de normales dans une texture ordinaire, où le pigment est calculé, puis la normale, et enfin la réflexion, la réfraction et l'illumination sont calculées une seule fois pour ce point.

Des textures entières peuvent aussi être utilisées avec les modèles de blocs comme le damier, l'hexagone ou la brique. Par exemple...

texture {
	checker
	texture {T_Wood12 scale .8}
	texture {
		pigment {White_Marble}
		finish {Shiny}
		scale .5
	}
}

Note : dans le cas des modèles de bloc, l'habillage texture est obligatoire autour des informations de texture. Notez aussi que cette syntaxe interdit l'utilisation d'une texture en couche, toutefois, vous pouvez contourner ceci en déclarant un identificateur de texture pour celle en couche, et en référençant l'identificateur.

Un spectre de texture est aussi utilisé avec le type de texture average. Voir la section "average" pour les détails.

Vous pouvez déclarer et utiliser des identificateurs de spectres de textures, mais la seule façon de déclarer un modèle de liste de bloc est de déclarer un identificateur de texture pour toute la texture.

3.4.5.2 Les pavés

Les versions précédentes avaient une texture modélisée appelée texture en pavés. Elle utilisait les mots clés tiles et tile2 pour créer un modèle de textures en damier.

TILES_TEXTURE:
	texture {
		tiles TEXTURE tile2 TEXTURE
		[TRANSFORMATIONS...]
	}

Bien que ce soit toujours supporté pour la compatibilité, vous devez utiliser le bloc de textures en damier, décrit dans la section "Les spectres de textures", plutôt que ces textures en pavés.

3.4.5.3 Les applications de matériaux

La texture modélisée d'application de matériaux étend le concept d'une application d'image pour appliquer des textures complètes plutôt que des couleurs pleines. Une application de matériaux vous permet de poser une texture bitmap en 2-D autour de vos objets 3-D.

Au lieu de placer la couleur de l'image sur la forme, une texture complète est basée sur l'index de la couleur de l'image en ce point. Vous devez spécifier une liste de textures à utiliser comme une palette de textures, au lieu de la palette de couleurs habituelle.

Quand c'est utilisé avec des fichiers de type GIF, et quelques images PNG et TGA, l'index du pixel est utilisé comme un index dans la liste des textures fournies. Pour les fichiers non organisés comme certaines images PNG et TGA, la valeur 8 bit du composant rouge est utilisée comme index.

Si l'index d'un pixel est plus grand que le nombre de textures de la liste, alors il est pris comme modulo de N, ou N est la longueur de la liste de textures.

Note : la déclaration material_map n'a rien à voir avec la déclaration material. Cette première n'est pas une méthode pour créer des matériaux modélisés. Voir "Les matériaux" pour une explication sur cette absence de relation.

3.4.5.3.1 La spécification d'une application de matériaux

La syntaxe pour material_map est :

MATERIAL_MAP:
	texture {
		material_map {
			BITMAP_TYPE "bitmap.ext"
			[BITMAP_MODS...] TEXTURE... [TRANSFORMATIONS...]
		}
	}
BITMAP_TYPE:
	gif | tga | iff | ppm | pgm | png | jpeg | tiff | sys
BITMAP_MOD:
	map_type Type | once | interpolate Type

Après le mot clé requis BITMAP_TYPE se trouve une expression de chaîne de caractères contenant le nom du fichier bitmap de matériaux, du type spécifié. Plusieurs modificateurs optionnels peuvent suivre la spécification du fichier. Ils sont décrits plus bas.

Note : les versions précédentes autorisaient des modificateurs avant BITMAP_TYPE, mais cette syntaxe a été remplacée par celle-ci.

Note : le format sys est spécifique au système comme BMP pour Windows ou Pict pour Macintosh.

Les fichiers spécifiés dans les déclarations material_map, seront cherchés dans le dossier courant, puis dans ceux spécifiés par le commutateur +L, ou les options Library_Path. Cela facilitera le stockage de ces fichiers dans un dossier séparé, en donnant une option Library_Path pour spécifier la bibliothèque des applications de matériaux. Voir "Les chemins de bibliothèque" pour les détails.

Par défaut, la matière est appliquée sur le plan x-y. Elle est projetée sur l'objet comme depuis la direction -z. Elle remplit exactement l'aire de coordonnées (x,y) entre (0,0) et (1,1), sans tenir compte de la taille d'origine de la bitmap. Pour changer cela, vous pouvez déplacer, tourner ou retailler la texture sur la surface de l'objet, comme désiré.

Le nom de fichier est optionnellement suivi par un ou plusieurs BITMAP_MODIFIERS. Il n'y a pas de modificateurs spécifiques à material_map. Il utilise les modificateurs de bitmap génériques map_type, once et interpolate décrits dans la section "Les modificateurs de bitmap".

Bien que interpolate est légal dans une application de matériaux, l'index de la couleur est interpolé avant le choix de la texture. Il n'interpole pas la couleur finale, comme vous pourriez le désirer. En général, cela n'est d'aucune utilité, mais cela sera corrigé dans les futures versions.

Après vient une ou plusieurs déclarations de texture. Chaque texture dans la liste correspond à un index du fichier bitmap. Par exemple :

texture {
	material_map {
		png "povmap.png"
		texture {	// utilisée avec l'index 0
			pigment {color red 0.3 green 0.1 blue 1}
			normal {ripples 0.85 frequency 10}
			finish {specular 0.75}
			scale 5
		}
		texture {	// utilisée avec l'index 1
			pigment {White}
			finish {
				ambient 0 diffuse 0
				reflection 0.9 specular 0.75
			}
		}
		// utilisée avec l'index 2
		texture {pigment {NeonPink} finish {Luminous}}
		texture {	//utilisée avec l'index 3
			pigment {
				gradient y
				color_map {
					[0.00 rgb <1, 0, 0>]
					[0.33 rgb <0, 0, 1>]
					[0.66 rgb <0, 1, 0>]
					[1.00 rgb <1, 0, 0>]
				}
			}
			finish {specular 0.75}
			scale 8
		}
	}
	scale 30
	translate <-15,-15, 0>
}

Après la déclaration d'un material_map, mais toujours dans la déclaration de texture, vous pouvez appliquer tout modificateur légal de texture.

Note : aucune autre déclaration de pigment, de normale ou de finition ne peut être ajoutée à la texture, en dehors de l'application de matériaux.

Ceci est illégal :

texture {
	material_map {
		gif "matmap.gif"
		texture {T1}
		texture {T2}
		texture {T3}
	}
	finish {phong 1.0}
}

La finition doit être ajoutée à chaque texture. Notez que les versions précédentes autorisaient de telles spécifications, mais n'en tenaient pas compte. Cette restriction sur la syntaxe fut nécessaire pour des corrections de défauts. Ceci signifie que quelques scènes de version 1.0, utilisant l'application de matériaux, nécessitent des modifications mineures, qui ne peuvent pas être automatisées avec la compatibilité.

Si un index n'est pas utilisé dans une image, il peut être nécessaire de fournir des textures factices. Il peut être utile d'utiliser un programme de dessin, ou un autre utilitaire, pour examiner la palette du fichier et déterminer comment arranger la liste de texture.

Les textures dans une application de matériaux, peuvent être empilées, mais les textures d'application de matériaux ne peuvent pas servir de couche. Pour utiliser une texture empilée, vous devez la déclarer comme un identificateur de texture, et l'appeler dans le liste de textures.

Complément sur le matériau

3.4.4 Le halo 3.4.4 Le halo 3.4.6 Les textures empilées 3.4.6 Les textures empilées