Implementazione della trama dell'immagine disturbata dal linguaggio renderman


8

Sto cercando di implementare (in C #) un algoritmo di perturbazione dell'immagine presentato nel libro "Texturing and modelling - K. Perlin et al" (pagina 91 se presente), che distorce un'immagine. Il codice seguente è in lingua Renderman: L'accesso alla trama

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

è sostituito da

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);

trasformando l'immagine a sinistra in quella a destra. inserisci qui la descrizione dell'immagine

Da ciò che non capisco, invece di accedere alle coordinate accediamo a coordinate leggermente perturbate e le visualizziamo in posizione , creando così un'immagine che appare leggermente perturbata .(s,t)[0,1](ss,tt)(s,t)

snoise(x) è definito come , mappando il rumore da a , e nella documentazione RenderMan dove P è un punto, restituisce un valore basato su un certo rumore (molto probabilmente perlin o reticolo). ( http://renderman.pixar.com/resources/current/RenderMan/noiseFunctions.html )(noise(x)2)1[0,1][1,1]noise(P)

Quello che non capisco è cosa fa la funzione di trasformazione, che dovrebbe mappare il punto 3D P nello spazio "shader", e come può essere implementato. Inoltre, non sono sicuro se il rumore (x) restituisca un punto 3d, un float (avrebbe più senso) e se posso usare una semplice implementazione 2d del rumore di Perlin per ottenere lo stesso effetto desiderato.

Risposte:


6

Come hai ipotizzato, la transform()funzione trasforma i punti da uno spazio coordinato a un altro. (Esistono anche vtransform()e ntransform()per trasformare rispettivamente vettori di direzione e vettori normali.) L'argomento stringa indica lo spazio di coordinate in cui trasformare.

Le Linee guida per l'ombreggiatura di Renderman hanno questo da dire al riguardo:

All'inizio dell'esecuzione dello shader, tutte le variabili punto, vettore, normale e matrice sono espresse nel sistema di coordinate "corrente". Quale sistema di coordinate sia "attuale" dipende dall'implementazione. È solo che "attuale" è "fotocamera" per PRMan *, ma non si dovrebbe mai fare affidamento su questo comportamento - è del tutto possibile che altri renderer conformi a RenderMan (compresi i futuri renderer di Pixar) possano usare un altro spazio (come "mondo") come spazio "attuale".

Segue un caso come questo come esempio. La maggior parte dei calcoli dell'illuminazione dovrebbe essere eseguita nello spazio della telecamera, ma la valutazione di una funzione di rumore dovrebbe essere nel sistema di coordinate dell'oggetto, perché si desidera che il rumore rimanga lo stesso mentre l'oggetto si muove attraverso lo spazio del mondo.

Nell'implementazione di C #, dovrai anche trasformare il punto in ombra dallo spazio della telecamera al sistema di coordinate dell'oggetto. Forse l'hai già fatto prima di calcolare le coordinate delle trame. In caso contrario, dovrai moltiplicare per la matrice di trasformazione dell'oggetto. Ricorda che l'unico uso di questo punto trasformato è come input (come un seme) al generatore di rumore Perlin. Imposta il dominio su cui varia il rumore: coordinate spaziali del mondo.

In RSL, la noise()funzione può restituire qualsiasi tipo che ti piace: a float, a color, a pointo a vector. Mentre lo aggiungi a un altro float( uo v), otterrai un floatcodice in questo codice. In realtà, le due noise()chiamate, aggiunte a se t, agiscono per generare un singolo vettore di rumore 2D. Nel tuo codice, se stai usando un vettore 2D per memorizzare le tue coordinate di trama, puoi usare una singola funzione di rumore che restituisce un vettore 2D, per ottenere lo stesso effetto in una riga di codice.


Se sei interessato a creare un buon generatore di rumore, Shadertoy ha molti shader di rumore con diverse varianti di rumore Perlin con proprietà diverse (isotropiche o meno, levigatezza e larghezza di banda configurabili) e vale la pena cercare ispirazione e suggerimenti di implementazione .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.