Implémentation de la texture d'image perturbée du langage renderman


8

J'essaie d'implémenter (en C #) un algorithme de perturbation d'image présenté dans le livre "Texturation et modélisation - K. Perlin et al" (page 91 si quelqu'un l'a), qui déforme une image. Le code suivant est en langage Renderman: L'accès à la texture

Ct = texture("example.tx", s, t);

est remplacé par

point Psh;
float ss, tt;
Psh = transform("shader", P);
ss = s + 0.2 * snoise(Psh);
tt = t + 0.2 * snoise(Psh+(l.5,6.7,3.4));
Ct = texture("example.tx", ss, tt);

transformer l'image de gauche en celle de droite. entrez la description de l'image ici

D'après ce que j'ai compris, au lieu d'accéder aux coordonnées nous accédons à des coordonnées légèrement perturbées et les affichons à l'endroit , créant ainsi une image qui semble légèrement perturbée .(s,t)[0,1](ss,tt)(s,t)

snojese(X) est défini comme , mappant le bruit de à , et dans la documentation RenderMan où P est un point, renvoie une valeur basée sur un peu de bruit (très probablement perlin ou treillis). ( http://renderman.pixar.com/resources/current/RenderMan/noiseFunctions.html )(nojese(X)2)-1[0,1][-1,1]nojese(P)

Ce que je ne comprends pas, c'est ce que fait la fonction de transformation, qui est censée mapper le point 3D P dans l'espace "shader", et comment peut-elle être implémentée. De plus, je ne sais pas si le bruit (x) renvoie un point 3D, un flottant (aurait plus de sens) et si je peux utiliser une simple implémentation 2D du bruit de Perlin pour atteindre le même effet souhaité.

Réponses:


6

Comme vous l'avez supposé, la transform()fonction transforme les points d'un espace de coordonnées en un autre. (Il existe également vtransform()et ntransform()pour la transformation des vecteurs de direction et des vecteurs normaux, respectivement.) L'argument chaîne nomme l'espace de coordonnées dans lequel se transformer.

Les Renderman Shading Guidelines ont ceci à dire à ce sujet:

Au début de l'exécution du shader, toutes les variables ponctuelles, vectorielles, normales et matricielles sont exprimées dans le système de coordonnées "courant". Le système de coordonnées qui est "actuel" dépend de l'implémentation. Il se trouve que "courant" est "appareil photo" pour PRMan *, mais vous ne devriez jamais compter sur ce comportement - il est tout à fait possible que d'autres moteurs de rendu conformes à RenderMan (y compris les futurs moteurs de rendu de Pixar) puissent utiliser un autre espace (comme "monde") comme espace "actuel".

Il donne ensuite un exemple comme celui-ci. La plupart des calculs d'éclairage doivent être effectués dans l'espace de la caméra, mais l'évaluation d'une fonction de bruit doit se faire dans le système de coordonnées de l'objet, car vous voulez que le bruit reste le même lorsque l'objet se déplace dans l'espace mondial.

Dans votre implémentation C #, vous devrez également transformer le point ombré de l'espace de la caméra au système de coordonnées de l'objet. Vous l'avez peut-être déjà fait avant de calculer les coordonnées de texture. Sinon, vous devrez multiplier par la matrice de transformation de l'objet. N'oubliez pas que la seule utilisation de ce point transformé est comme entrée (comme une graine) pour le générateur de bruit Perlin. Il définit le domaine dans lequel le bruit varie: les coordonnées de l'espace mondial.

Dans RSL, la noise()fonction peut renvoyer n'importe quel type que vous aimez: a float, a color, a pointou a vector. Lorsque vous l'ajoutez à un autre float( uou v), vous obtiendrez un floatdans ce code. En réalité, les deux noise()appels, ajoutés à set t, agissent pour générer un seul vecteur de bruit 2D. Dans votre propre code, si vous utilisez un vecteur 2D pour stocker vos coordonnées de texture, vous pouvez utiliser une seule fonction de bruit qui renvoie un vecteur 2D, pour obtenir le même effet sur une seule ligne de code.


Si vous êtes intéressé à faire un bon générateur de bruit, Shadertoy a beaucoup de shaders de bruit avec différentes variantes de bruit Perlin avec des propriétés différentes (isotropes ou non, lissé configurable et bande passante) et mérite d'être examiné pour l'inspiration ainsi que des conseils de mise en œuvre .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.