Ce patch permet la création d'une nouvelle image de texture à partir d'un échantillon. Codé d'après un papier de Alexei A. Efros et Willian T. Freeman. Le principe est de prendre des petits rectangles de l'image échantillon et de les 'coller' au mieux pour former l'image finale. On peut ainsi générer des textures de toutes tailles, ainsi que des textures non identiques du fait que le choix des blocs à coller comporte une part de hasard.
image_map { synthese taillex,tailley blockx,blocky R1 image_type image_file ... }
taillex
et tailley
donnent la résolution de l'image à créer. blockx
et blocky
la taille des rectangles à prendre dans l'échantillon de texture. R1
est un identificateur obtenu à l'aide de seed (#declare R1=seed(1234);), c'est lui qui est utilisé pour la partie aléatoire de l'algorithme. image_type
et image_file
donnent le fichier image échantillon (exemple: tga "modele.tga". Il faut une image 24 bits). A la suite vous pouvez spécifier les modificateurs habituels d'une image_map
(once
, map_type
etc).
Le temps de synthèse est très dépendant de la taille de l'échantillon, il vaut donc mieux choisir de petites images (moins de 200x200). Le choix de blockx,blocky
dépend de l'image modèle, de la taille des structures de la texture.
Voici les résultats de la synthèse pour quelques textures. Chaque texture échantillon est de taille environ 192x192, et pour chacune d'entre elles deux images de taille 400x400 sont générées : une avec des blocs 40x40 et une avec des blocs 20x20 (La plus réussie est celle présentée).
Pour certains cas où les résultats sont mauvais il doit être possible d'obtenir mieux en choisissant plus subtilement la taille des blocs !
Le script pour générer ces images est le suivant :
#version Unofficial mlpov 0.8; camera { orthographic location <0.5,0.5,-2> right 1*x up 1*y look_at <0.5,0.5,0> } #declare R1=seed(1234); plane { z,0 pigment { image_map { synthese 400,400 20,20 R1 sys "vistex01.bmp" once } } finish { ambient 1 } }