Implementación de textura de imagen perturbada del lenguaje renderman

8

Estoy tratando de implementar (en C #) un algoritmo de perturbación de imagen presentado en el libro "Texturizado y modelado - K. Perlin et al" (página 91 si alguien lo tiene), que distorsiona una imagen. El siguiente código está en lenguaje Renderman: el acceso de textura

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

es reemplazado por

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

transformando la imagen de la izquierda a la de la derecha. ingrese la descripción de la imagen aquí

Por lo que no entendí, en lugar de acceder a las coordenadas accedemos a coordenadas ligeramente perturbadas y las mostramos en el lugar , creando así una imagen que se ve ligeramente perturbada .(s,t)[0 0,1](ss,tt)(s,t)

snorteoyosmi(X) se define como , el ruido de mapeo de a , y en la documentación de RenderMan el donde P es un punto, devuelve un valor basado en algo de ruido (muy probablemente perlin o celosía). ( http://renderman.pixar.com/resources/current/RenderMan/noiseFunctions.html )(noise(x)2)1[0,1][1,1]norteoyosmi(PAGS)

Lo que no entiendo es qué hace la función de transformación, que se supone que asigna el punto P 3d al espacio "sombreador", y cómo se puede implementar. Además, no estoy seguro de si el ruido (x) devuelve un punto 3d, un flotador (tendría más sentido) y si puedo usar una implementación 2d simple del ruido de Perlin para alcanzar el mismo efecto deseado.

simog
fuente

Respuestas:

6

Como has supuesto, la transform()función transforma puntos de un espacio de coordenadas a otro. (También hay vtransform()y ntransform()para transformar vectores de dirección y vectores normales, respectivamente.) El argumento de cadena nombra el espacio de coordenadas para transformar.

Las Pautas de sombreado de Renderman tienen esto que decir al respecto:

Al comienzo de la ejecución del sombreador, todas las variables de punto, vector, normal y matriz se expresan en el sistema de coordenadas "actual". Exactamente qué sistema de coordenadas es "actual" depende de la implementación. Da la casualidad de que "actual" es "cámara" para PRMan *, pero nunca debe contar con este comportamiento: es completamente posible que otros renderizadores compatibles con RenderMan (incluidos los futuros renderizadores de Pixar) puedan usar otro espacio (como "mundo") como espacio "actual".

Continúa dando un caso como este como ejemplo. La mayoría de los cálculos de iluminación deben realizarse en el espacio de la cámara, pero la evaluación de una función de ruido debe realizarse en el sistema de coordenadas del objeto, porque desea que el ruido permanezca igual a medida que el objeto se mueve a través del espacio mundial.

En su implementación de C #, también deberá transformar el punto sombreado desde el espacio de la cámara al sistema de coordenadas del objeto. Tal vez ya haya hecho esto antes de calcular las coordenadas de textura. De lo contrario, deberá multiplicar por la matriz de transformación del objeto. Recuerde que el único uso de este punto transformado es como una entrada (como una semilla) al generador de ruido Perlin. Establece el dominio sobre el que varía el ruido: las coordenadas del espacio mundial.

En RSL, la noise()función puede devolver cualquier tipo que desee: a float, a color, a pointo a vector. A medida que lo agregue a otro float( uo v), obtendrá un floaten este código. Realmente, las dos noise()llamadas, agregadas a sy t, están actuando para generar un solo vector de ruido 2D. En su propio código, si está usando un vector 2D para almacenar sus coordenadas de textura, puede usar una sola función de ruido que devuelve un vector 2D, para obtener el mismo efecto en una línea de código.


Si está interesado en hacer un buen generador de ruido, Shadertoy tiene muchos sombreadores de ruido con diferentes variantes de ruido Perlin con diferentes propiedades (isotrópicas o no, suavidad y ancho de banda configurables) y vale la pena buscar inspiración, así como sugerencias de implementación .

Dan Hulme
fuente