3.4.1 Le pigment

La couleur ou le modèle de couleurs d'un objet sont définis dans la déclaration du pigment. Toutes les textures simples doivent avoir un pigment. Sinon le pigment par défaut est utilisé. La couleur que vous définissez est celle de l'objet pleinement illuminé. Vous donnez la couleur et POV-Ray l'éclaircit ou l'assombrit selon l'illumination de la scène. Le paramètre est appelé pigment car vous définissez la couleur de base de l'objet plutôt que son apparence.

La syntaxe est :

PIGMENT:
	pigment {
		[PIGMENT_IDENTIFIER]
		[PIGMENT_TYPE]
		[PIGMENT_MODIFIER...]
	}
PIGMENT_TYPE:
	PATTERN_TYPE | COLOR |
	image_map {
		BITMAP_TYPE "bitmap.ext" [IMAGE_MAP_MODS...]
	}
PIGMENT_MODIFIER:
	PATTERN_MODIFIER | COLOR_LIST | PIGMENT_LIST |
	color_map { COLOR_MAP_BODY } | colour_map { COLOR_MAP_BODY } |
	pigment_map { PIGMENT_MAP_BODY } | quick_color COLOR |
	quick_colour COLOR

Chacun des éléments du pigment est optionnel, mais ils doivent apparaître dans cet ordre. Tous les éléments après PIGMENT_IDENTIFIER modifient, ou écrasent, les options de l'identificateur. Si aucun identificateur n'est spécifié, alors les éléments modifient les valeurs du pigment de la texture par défaut. Le PIGMENT_TYPE se partage grossièrement en quatre catégories. Chacune d'elles est vue plus bas. Elles sont la couleur unie, le modèle d'application d'image qui sont spécifiques à la déclaration pigment, ou le modèle de liste de couleurs, le modèle de spectre de couleurs qui utilisent la large sélection de modèles généraux de POV-Ray. Voir "Les modèles" pour les détails.

Le type de modèle est optionnellement suivi par un ou plusieurs modificateurs de pigment. En plus des modificateurs de modèles génériques, comme les déclarations de transformation, de turbulence et de tourbillon, les pigments peuvent aussi avoir COLOR_LIST, PIGMENT_LIST, color_map, pigment_map et quick_color qui sont spécifiques au pigment. Voir "Les modificateurs de modèle" pour des informations sur les modificateurs génériques. Les modificateurs spécifiques sont décrits dans les sections qui suivent. Les modificateurs de pigment s'appliquent seulement sur le pigment, et non sur les autres parties de la texture. Ils doivent être donnés en dernier.

Une déclaration de pigment est une partie de la spécification d'une texture. Toutefois, il peut être exagéré d'utiliser une texture pour seulement ajouter une couleur à un objet. C'est pourquoi vous pouvez attacher directement un pigment à un objet sans spécifier exactement qu'il fait partie d'une texture. Par exemple, au lieu de cela :

object {My_Object texture {pigment {color Red}}}

Vous pouvez raccourcir en ceci :

object {My_Object pigment {color Red}}

Ceci crée une texture complète avec les déclarations de normale et de finition par défaut, comme si vous l'aviez explicitement englobé dans texture {...}.

Les identificateurs de pigments peuvent être déclarés pour rendre la scène plus lisible et paramétrable. Ils sont déclarés comme ceci :

PIGMENT_DECLARATION:
	#declare IDENTIFIER = PIGMENT |
	#local IDENTIFIER = PIGMENT

IDENTIFIER est le nom de l'identificateur sur 40 caractères, et PIGMENT est toute déclaration de pigment valide. Voir "#declare vs. #local" pour des informations sur la portée.

3.4.1.1 Les pigments de couleur unie

Le type le plus simple de pigment est la couleur unie. Pour le spécifier, vous placez simplement une spécification de couleur dans le pigment. Par exemple :

pigment {color Orange}

Une spécification de couleur consiste en un mot clé color suivi par un identificateur de couleur, ou par une spécification d'une quantité de rouge, de vert, de bleu, de transparence filtrée et non filtrée en surface. Voir la section "Spécifier les couleurs" pour plus de détails. Tout modificateur de modèle utilisé avec une couleur unie est ignoré, car il n'y a pas de modèle à modifier.

3.4.1.2 Les pigments à liste de couleur

Il y a quatre modèles de liste de couleurs : checker, hexagon, brick et object. Le résultat est un modèle de couleurs unies, avec des bords distincts, plutôt qu'un mélange de couleurs comme dans les modèles de spectres de couleurs. Chacun de ces modèles est couvert en détails dans une prochaine section. La syntaxe est :

COLOR_LIST_PIGMENT:
	pigment {brick [COLOR_1, [COLOR_2]] [PIGMENT_MODIFIERS...] }|
	pigment {checker [COLOR_1, [COLOR_2]] [PIGMENT_MODIFIERS...]}|
	pigment {
		hexagon [COLOR_1, [COLOR_2, [COLOR_3]]] [PIGMENT_MODIFIERS...]
	}|
	pigment {object OBJECT_IDENTIFIER | OBJECT {} [COLOR_1, COLOR_2]}

Chaque COLOR_n est une spécification de couleur valide. Il doit y avoir une virgule entre chaque couleur, ou le mot clé color doit être utilisé comme séparateur, pour que POV-Ray puisse déterminer le début et la fin de chaque spécification de couleur. Les modèles brick et checker attendent deux couleurs et hexagon trois couleurs. Si la quantité n'est pas atteinte, les couleurs par défaut sont utilisées.

3.4.1.3 Les spectres de couleurs

La plupart des modèles de couleur n'utilisent pas des changements abrupts de deux ou trois couleurs, comme dans le modèle de la brique, du damier ou de l'hexagone. Au lieu de cela, ils utilisent de douces transitions de plusieurs couleurs qui changent graduellement d'un point à l'autre. Les couleurs sont définies dans un modificateur de pigment appelé un color_map, qui décrit la façon dont le modèle passe d'une couleur à l'autre.

Chacun des types variés de modèles est, en fait, une fonction mathématique, qui prend toute position x, y, z, et la transforme en un nombre entre 0.0 et 1.0, inclus. Ce nombre est utilisé pour spécifier le mélange de couleurs du spectre à utiliser.

La syntaxe pour color_map est :

COLOR_MAP:
	color_map { COLOR_MAP_BODY } | colour_map { COLOR_MAP_BODY }
COLOR_MAP_BODY:
	COLOR_MAP_IDENTIFIER | COLOR_MAP_ENTRY...
COLOR_MAP_ENTRY:
	[ Value COLOR ] | 
	[ Value_1, Value_2 color COLOR_1 color COLOR_2 ]

Où chaque Value_n est une valeur numérique entre 0.0 et 1.0, inclus, et chaque COLOR_n est une spécification de couleur.

Note : les parenthèses [] font partie de COLOR_MAP_ENTRY. Ce ne sont pas des symboles de notation pour donner les parties optionnelles. Les parenthèses entourent chaque entrée du spectre de couleurs.

Il peut y avoir entre 2 et 256 entrées. Le mot colour_map peut être également utilisé.

Voici un exemple :

sphere {
	<0, 1, 2>, 2
	pigment {
		gradient x	// voici le PATTERN_TYPE
		color_map {
			[0.1 color Red]
			[0.3 color Yellow]
			[0.6 color Blue]
			[0.6 color Green]
			[0.8 color Cyan]
		}
	}
}

La fonction gradient x du modèle est évaluée, et le résultat est une valeur entre 0.0 et 1.0. Si la valeur est inférieure à la première entrée (0.1 dans ce cas) alors la première couleur est utilisée (rouge). Les valeurs entre 0.1 et 0.3 utilisent un mélange de rouge et de jaune, par interpolation linéaire entre ces deux couleurs. De même, les valeurs entre 0.3 et 0.6 vont de jaune à bleu.

Les troisièmes et quatrièmes entrées ont la valeur 0.6. Cela provoque un passage abrupt du bleu au vert. Une valeur inférieure à 0.6 sera bleue, à 0.6, elle sera verte. En continuant, les valeurs de 0.6 à 0.8 seront un mélange de vert et de cyan. Finalement, toute valeur plus grande ou égale à 0.8 sera cyan.

Si vous voulez des aires de couleur non changeante, il suffit de spécifier la même couleur à deux entrées adjacentes. Par exemple :

color_map {
	[0.1 color Red]
	[0.3 color Yellow]
	[0.6 color Yellow]
	[0.8 color Green]
}

Dans ce cas, toute valeur entre 0.3 et 0.6 sera jaune pur.

La première version de syntaxe de COLOR_MAP_ENTRY avec un numérique et une couleur est le standard. L'autre version à double entrée est obsolète et doit être évitée. L'exemple précédent aurait donné avec l'ancienne syntaxe.

color_map {
	[0.0 0.1 color Red color Red]
	[0.1 0.3 color Red color Yellow]
	[0.3 0.6 color Yellow color Yellow]
	[0.6 0.8 color Yellow color Green]
	[0.8 1.0 color Green color Green]
}

Le mot clé color_map peut être utilisé avec tout modèle, sauf pour brick, checker, hexagon, object et image_map. Vous pouvez déclarer et utiliser des identificateurs color_map. Par exemple :

#declare Rainbow_Colors = color_map {
	[0.0 color Magenta]
	[0.33 color Yellow]
	[0.67 color Cyan]
	[1.0 color Magenta]
}
object {
	My_Object
	pigment {
		gradient x
		color_map {Rainbow_Colors}
	}
}

3.4.1.4 Les spectres et les listes de pigments

Avec la spécification de couleurs mélangées, grâce au spectre de couleurs, vous pouvez créer un mélange de pigments en utilisant le spectre de pigments. La syntaxe est identique à celle du spectre de couleurs, sauf que vous spécifiez un pigment à chaque entrée (et non une couleur).

La syntaxe pour pigment_map est :

PIGMENT_MAP:
	pigment_map { PIGMENT_MAP_BODY }
PIGMENT_MAP_BODY:
	PIGMENT_MAP_IDENTIFIER | PIGMENT_MAP_ENTRY...
PIGMENT_MAP_ENTRY:
	[ Value PIGMENT_BODY ]

Value est une valeur numérique entre 0.0 et 1.0, inclus et chaque PIGMENT_BODY est toute chose qui apparaît normalement dans une déclaration pigment{...}, mais le mot clé pigment et les parenthèses {} ne sont pas nécessaires.

Note : les parenthèses [] font partie de PIGMENT_MAP_ENTRY, et ne sont pas des symboles de notation pour signaler les parties optionnelles. Elles entourent chaque entrée du spectre.

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

Par exemple :

sphere {
	<0, 1, 2>, 2
	pigment {
		gradient x	// ceci est le PATTERN_TYPE
		pigment_map {
			[0.3 wood scale 0.2]
			[0.3 Jade]	// ceci est un identificateur de pigment
			[0.6 Jade]
			[0.9 marble turbulence 1]
		}
	}
}

Quand la fonction gradient x retourne des valeurs entre 0.0 et 0.3, le pigment bois retaillé est utilisé. De 0.3 à 0.6, l'identificateur de pigment Jade est utilisé. De 0.6 à 0.9, un mélange de Jade et d'un marbre avec turbulence, est utilisé. A partir de 0.9, seul le marbre est utilisé.

Les spectres de pigments peuvent être emboîtés au niveau de complexité que vous désirez. Les pigments dans un spectre peuvent avoir des spectres de couleurs, ou des spectres de pigments, ou tout type de pigment désiré. Toute entrée de spectre de pigments peut être une couleur unie, toutefois, si toutes les entrées sont des couleurs unies, vous devriez utiliser plutôt un spectre de couleurs, qui est rendu plus rapidement.

Des pigments complets peuvent également être utilisés avec les modèles de bloc, comme le damier, l'hexagone ou la brique. Par exemple...

pigment {
	checker
	pigment {Jade scale .8}
	pigment {White_Marble scale .5}
}

Note : dans le cas de modèles de bloc, l'emballage pigment est obligatoire devant l'information pigment.

Un spectre de pigments est aussi utilisé avec le type de pigment average. Voir "Le modèle moyen" pour les détails.

Vous ne pouvez pas utiliser pigment_map ou des pigments individuels avec un image_map. Voir la section "Les spectres de textures" pour une voie détournée.

Vous pouvez déclarer et utiliser des identificateurs de spectres de pigments, mais la seule façon de déclarer une liste de modèle de bloc de pigments est de créer un identificateur pour tout le pigment.

3.4.1.5 Les applications d'image

Quand tout échoue, et que les précédents types de modèles de pigment ne vous donnent pas satisfaction, vous pouvez utiliser un image_map pour appliquer une image en 2-D autour de vos objets 3-D.

3.4.1.5.1 La spécification d'une application d'image

La syntaxe pour image_map est :

IMAGE_MAP:
	pigment {
		image_map {
			[BITMAP_TYPE] "bitmap[.ext]"
			[IMAGE_MAP_MODS...]
		}
		[PIGMENT_MODFIERS...]
	}
BITMAP_TYPE:
	gif | tga | iff | ppm | pgm | png | jpeg | tiff | sys
IMAGE_MAP_MOD:
	map_type Type | once | interpolate Type |
	filter Palette, Amount | filter all Amount |
	transmit Palette, Amount | transmit all Amount

Après le mot clé BITMAP_TYPE optionnel se trouve une expression chaîne de caractères contenant le nom de l'image bitmap du type spécifié. Si le BITMAP_TYPE n'est pas donné, le même type est pris que celui fixé pour le fichier de sortie.
Exemple :

plane {
	-z, 0 
	pigment {
		image_map {png "Eggs.png"}
	}
}

plane {
	-z, 0 
	pigment {
		image_map {"Eggs"}
	}
}

La seconde méthode cherchera et utilisera "Eggs.png" si le type de fichier en sortie est png (Output_File_Type = N dans le fichier INI ou +FN dans le ligne de commande). Cela est particulièrement utile si l'image utilisée dans image_map est aussi rendue avec POV-Ray.

Plusieurs modificateurs optionnels peuvent suivre la spécification de fichier. Les modificateurs sont décrits plus bas.

Note : les précédentes versions autorisaient certains modificateurs avant BITMAP_TYPE mais cette syntaxe est démodée.

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

Les noms de fichiers spécifiés dans les déclarations image_map seront cherchés d'abord dans le dossier courant, puis dans les dossiers de l'option +L ou Library_Path. Cela facilitera le stockage de vos fichiers d'images à appliquer dans un sous-dossier en donnant une option Library_Path pour spécifier où votre dossier d'images se trouve. Voir "Les chemins de bibliothèques" pour les détails.

Par défaut, l'image est appliquée sur le plan x-y. Elle est projetée sur l'objet comme si le projecteur générateur était dans la direction -z. Elle remplit exactement l'aire carrée de coordonnées (x, y), de (0, 0) à (1, 1) sans se préoccuper de la taille d'origine de l'image. Si vous voulez changer cela, vous pouvez déplacer, tourner ou retailler le pigment, ou la texture, pour la coller sur l'objet selon vos désirs.

Dans la section "Le modèle damier", le modèle de pigment checker est expliqué. Les damiers sont décrits comme des cubes pleins en argile colorée, dans lesquels sont creusés les objets. Avec les applications d'image, vous devez imaginer que chaque pixel est une longue baguette fine, carrée, colorée, qui s'étend parallèlement à l'axe des z. L'image est faite de lignes et de colonnes de ces baguettes liées ensembles, et l'objet est creusé dans ce groupe.

Si vous voulez changer cette orientation par défaut, vous pouvez déplacer, tourner ou retailler le pigment, ou la texture, pour la coller sur l'objet selon vos désirs.

Le nom de fichier est optionnellement suivi par un ou plusieurs BITMAP_MODIFIERS. Les modificateurs filter, filter all, transmit et transmit all sont spécifiques aux applications d'image et sont vus dans les sections suivantes. Un image_map peut aussi utiliser des modificateurs génériques de bitmap comme map_type, once et interpolate, décrits dans "Les modificateurs de bitmap".

3.4.1.5.2 Les modificateurs 'filter' et 'transmit'

Pour rendre une image transparente en partie ou totalement, vous pouvez spécifier des valeurs de filtre et/ou de transmission pour les couleurs des registres/spectres des images PNG, GIF ou IFF (bref, pour les modes qui utilisent les palettes). Vous pouvez le faire en ajoutant le mot clé filter ou transmit derrière le nom de fichier. Le mot clé est suivi de deux nombres. Le premier est la valeur du numéro de palette, et le second est la quantité de transparence. Les valeurs doivent être séparées par une virgule. Par exemple :

image_map {
	gif "mypic.gif"
	filter 0, 0.5	// Rend la couleur 0 filtrée transparente à 50%
	filter 5, 1.0	// Rend la couleur 5 filtrée transparente à 100%
	transmit 8, 0.3	// Rend la couleur 8 non filtrée transparente à 30%
}

Vous pouvez donner une valeur de filtre ou de transmission à toute l'image en utilisant filter all Amount ou transmit all Amount. Par exemple :

image_map {
	gif "stnglass.gif"
	filter all 0.9
}

Note : les précédentes versions utilisaient le mot clé alpha pour spécifier la transparence filtrée, toutefois, ce mot est souvent utilisé pour la transparence non filtrée. C'est pour cela qu'il n'est plus utilisé.

Voir la section "La spécification des couleurs" pour les détails sur les différences entre la transparence filtrée et non filtrée.

3.4.1.5.3 Utilisation du canal alpha

Une autre façon de spécifier la transmission non filtrée dans une image, est l'utilisation du canal alpha. POV-Ray utilisera automatiquement le canal alpha pour la transparence quand elle est stockée dans l'image. Le format PNG vous autorise le stockage de différentes transparences pour chaque index de couleur du fichier, si désiré. Si votre programme de peinture supporte cette caractéristique, vous pouvez faire l'édition des transparences dans votre programme de peinture, plutôt que par la spécification des valeurs de transmission de chaque couleur, dans le fichier POV. Puisque les formats d'image PNG et TGA peuvent aussi conserver l'information du canal alpha (transparence), vous pouvez générer des projections d'image dont la transparence n'est pas dépendante de la couleur, mais plutôt de la position du pixel dans l'image.

Bien que POV utilise transmit 0.0 pour spécifier aucune transparence, et 1.0 pour une transparence totale, les valeurs de alpha fonctionnent dans l'autre sens, de 0 à 255. Une donnée alpha de 0 signifie la même chose que transmit 1.0, et celle de 255 produit transmit 0.0.

3.4.1.6 La couleur rapide

Durant le développement de scènes POV-Ray, il est souvent utile de faire des tests de basse qualité, qui se rendent plus vite. Le commutateur +Q de la ligne de commande, ou l'option INI Quality, peuvent être utilisés pour désactiver certains longs calculs de modèle de couleur ou d'illumination, pour accélérer les choses. Voir "Les paramétrages de la qualité" pour les détails. Toutefois, toute utilisation de +Q5, ou moins, désactive le calcul du pigment, et crée des objets gris.

Par ajout de quick_color à un pigment, vous dites à POV-Ray la couleur unie à utiliser pour accélérer le rendu, à la place du pigment modélisé. Par exemple :

pigment {
	gradient x
	color_map {
		[0.0 color Yellow]
		[0.3 color Cyan]
		[0.6 color Magenta]
		[1.0 color Cyan]
	}
	turbulence 0.5
	lambda 1.5
	omega 0.75
	octaves 8
	quick_color Neon_Pink
}

Ceci dit d'utiliser le Neon_Pink pour les tests en qualité +Q5, ou moins, mais d'utiliser le modèle à gradient turbulent pour +Q6 et plus. Les pigments de couleur unie comme

pigment {color Magenta}

mettent automatiquement quick_color à cette valeur. Vous pouvez écraser cela si vous le désirez. Supposons que vous ayez 10 sphères à l'écran, et qu'elles soient toutes jaunes. Si vous voulez les identifier individuellement, vous pouvez leur donner une quick_color différente à chacune, comme ceci :

sphere {
	<1, 2, 3>, 4
	pigment {color Yellow quick_color Red}
}
sphere {
	<-1,-2,-3>, 4
	pigment {color Yellow quick_color Blue}
}

et ainsi de suite. A +Q6, ou plus, elles seront toutes jaunes, mais en dessous, elles auront chacune une couleur pour les identifier.

La syntaxe quick_colour est aussi supportée.

Complément sur les modificateurs de modèle

3.4 Les textures 3.4 Les textures 3.4.2 La normale 3.4.2 La normale