02 mayo 2016

4.9. V-Ray. Rebotes primarios y secundarios

Es importante tener una cantidad de muestras secundarias adecuada, ya que influye en uno de los problemas que aparecen en los renders: el ruido. El ruido es la falta de contraste entre píxeles cuyo resultado es una especie de suciedad grisácea que impregna todo el render.


Aquí tienes un ejemplo de la escena sin demasiadas muestras secundarias, a pesar de que disponemos de suficientes muestras primarias. No disponer de suficientes muestras secundarias obliga al motor de render a que las muestras primarias trabajen más de la cuenta. Debemos asegurarnos de que la muestras primarias y secundarias trabajen en sus funciones para evitar tiempos de render elevados.

La Iluminación Global (GI) es un cálculo independiente a las muestras primarias. Funciona así: se lanzar una primera muestra, rebota en una superficie y a partir de ahí lanza múltiples muestras, rebotando en otras superficies hasta que se logra la iluminación indirecta. Cuando rebota por segunda vez no vuelve a hacer lo mismo que en el primer rebote, pero rebotará un número determinado de veces que podemos definir y que determina la calidad del render (más rebotes más tiempo de render).

Dependiendo de la escena, los rebotes secundarios no serán tan importantes como los primarios. En exteriores importan los rebotes primarios y en interiores los secundarios. Sabiendo esto, podemos sacrificar rebotes primarios o secundarios en función del tipo de escena.

Vamos a activar la GI yendo a la pestaña GI y en la persiana Global Illumination activamos enable GI. 


Ya tenemos activado el primary y secondary engine. Explicaré a grandes rasgos brute force, light cache, irradiance map y las combinaciones recomendadas dependiendo del tiempo que dispongamos y la escena que tengamos entre manos.

-Brute force: es el motor más preciso de los que he enumerado. Es preciso con todo tipo de detalles, en animaciones no parpadea (flickering), no necesita demasiada memoria, no hay problemas con el motion blur y se puede usar para realizar DR (Distribute Rendering. Este concepto se verá más adelante). Por el contrario, es muy lento en escenas complejas (sobretodo en interiores) y tiende a producir mucho ruido. El ruido que produce brute force es lo que a muchos echa atrás y eligen otras opciones, pero si se conoce se puede usar sin problemas.

No pulsaremos en la casilla de default, porque trabajaremos con los parámetros que tenemos (más adelante se abordará el resto de configuraciones). En subdivs ponemos los samples que queremos para brute force.

Voy a explicar lo básico para que entiendas el funcionamiento. Por ahora, pondré el AA fixed con una subdivisión, pondré adaptative amount a 0 (aquí he quitado la adaptatibilidad para que comprendas el funcionamiento de brute force) y en brute force emplearé 32 muestras por pixel. 

Esto es lo que debería aparecerte por defecto.


Aunque ha tardado bastante (unos 28 minutos), sé que con 32 subdivisiones tengo la escena limpia de ruido (salvo por las sombra de la tetera, que depende de las subdivisiones de la luz de V-Ray).


Hay relación directa entre la cantidad de subdivisones del AA y la cantidad de subdivisiones del primary y secondary engine (brute force). El motor de render realiza un cálculo matemático: nsubdivsGI2/nsubdivsAA2 ¿Qué implica este cálculo? Que si subimos las subdivisiones del fixed incrementará la cantidad de muestras para el motor secundario. En nuestro caso, con el fixed a 1 tenemos 1024 muestras de AA y 1024 muestras por píxel, mientras que si ponemos el fixed a 2 nos dará 256 muestras de AA y 1024 muestras por píxel. Esto puedes verificarlo yendo a la pestaña GI, a la persiana Brute Force y comprobar los valores que aparecen a la derecha de subdivs y bounces (si ves que no cambian los valores, tendrás que pulsar el spinner de subdivs; no actualiza en tiempo real los valores). Si aplicamos la fórmula que he enseñado, los números cuadran: 322/22=256 muestras por sample de AA.

¿Esto funciona con un filtro AA adaptative? Por supuesto. Ahora, usaremos ese filtro de AA con un mínimo de 1 y un máximo de 2. Si comprobamos los cálculos vemos que sigue sucediendo lo mismo, pero con la diferencia de que este filtro de AA es adaptativo, por lo que obtenemos 256 muestras de AA y 256/1024 muestras por píxel.

El parámetro divide shading subdivs del filtro de AA permite desvincular el subdivs del filtro de antialiasing y el subivs del brute force, es decir, que el motor coge únicamente el valor del subdivs del brute force y lo dobla (1x1, 2x2, 3x3…) En nuestro caso, pasamos de 256 muestras de AA y 256/1024 a 1024 muestras de AA y 1024/4096 muestras por píxel. Hay que tener cuidado porque se nos disparan las muestras. En este ejemplo, la escena es pequeña y simple, pero en otras más complejas los números pueden dispararse y asustarían a cualquiera.

En esta escena de ejemplo, sé que con 32 subdivisiones de GI y con un AA adaptative de 1-4 obtengo un resultado óptimo para la resolución que he escogido, donde el AA hace su trabajo y el nivel de ruido es aceptable (en definitiva, 64/64 de AA y 64/1024 muestras por pixel). Ahora bien, no es plan de que se tenga unos máximos de samples estratosféricos en escenas complejas, así que se puede hacer otra cosa diferente.

Pasaré a explicar algunas cosas de la persiana global DMC. Aquí podremos controlar la cantidad de adaptatibilidad para el motor de render, de forma que no se vea obligado a alcanzar el máximo valor de samples de antialiasing.


En adaptative amount se le indica al motor de render que sea totalmente adaptativo (1) o que no lo sea (0), para que el motor lance más o menos muestras secundarias. Si vamos probando con decimales (0,1, 0,2, 0,3…) vemos que la cantidad de subdivisiones va cambiando (si uso un 0,3, por ejemplo, de 64/64 de AA y 64/1024 para muestras por pixel que tenía antes se me queda en 45/64 de AA y 45/1024 para muestras por pixel). ¿Esto me aumenta o me reduce los tiempos de render? Depende de la escena; en ocasiones sí, en otras no. Para nuestra escena de muestra, he hecho un render sin adaptatibilidad (0) y otro con adaptatibilidad (0,3 en adaptative amount).


Ha tardado menos tiempo, efectivamente, teniendo en cuenta que el render 2 se hizo con un AA fixed a 1.

Con noise threshold controlamos que lance más o menos muestras secundarias. En caso de que el motor vea que no es suficiente con el noise threshold pasará al color threshold.
¿Qué quiere decir un valor de 0,005 en noise threshold? Si le decimos que sea completamente adaptativo (adaptative amount de 1), traza una muestra primaria, luego se fija en las min samples (por defecto en 16) y utilizará como mínimo 16 muestras secundarias, luego comprueba esos pixels y si el valor resultante está por encima del noise threshold lanzará muestras hasta que se alcance el valor puesto en adaptative amount, que afecta a las muestras secundarias mínimas que se lanzarán. De todas formas, hay que tener mucho cuidado con dar demasiado margen en min samples y el máximo de subdivisiones de muestras secundarias. Para comprobar qué sucede, cambiaré el min samples que está en 16 a 4 y dejaré las muestras máximas secundarias en 1024.


En este caso, la diferencia de tiempo de render ha sido de unos segundos, pero en escenas complejas puede tardar más tiempo, porque le hemos dejado demasiado margen, hasta podría renderizar más lentamente que un AA fixed.

Con todo esto visto, debo decir que usar un adaptative amount de 1 o un min samples de 2 nos dá más adaptatibilidad, pero a costa de un resultado final peor y mayor tiempo de render, porque el motor pierde tiempo decidiendo en qué partes necesita más o menos adaptatibilidad. Por tanto, en adaptative amount es recomendable usar valores que oscilen entre 8 y 16 en función de la escena; en interiores no se le da valores altos, porque no necesita muchas muestras. En exteriores, se necesitan cantidades de adaptative amount más grandes.

En conclusión, debemos establecer una diferencia de valores razonable para que la adaptatibilidad entre en juego. Si tenemos que hacer un render y vamos apurados de tiempo, se prefieren valores pequeños y espacio entre valores pequeños (26/64 en AA y 416/1024 muestras por píxel en interiores, por ejemplo).

-Light Cache. Es un sistema de path tracing: lanza un rayo de luz desde la cámara hasta llegar a los objetos de la escena, luego lanza un segundo rayo, localiza el primero que se había lanzado, coge su información y lo incorpora a la escena, es decir, no se molesta en calcular otra trayectoria que le supondría más trabajo y más tiempo de render. Sigue lanzando más rayos hasta formar un mapa de GI. Si el Ligth Cache no encuentra luz no rebota, si encuentra luz, rebota. Llega la luz a más zonas de la escena. Y la intensidad final atenúa en lineal, no enexponencial, por tanto no pierde tanta luz como un Brute Force.

Light Cache sustituyó a Photon Map, ya que solventaba problemas (como el de generar bordes oscuros, como una especie de oclusión ambiental). Es por este motivo que no veré este motor.

Para nuestro ejemplo, trabajaremos con brute force de primary engine y light cache de seconday engine, sin adaptatibilidad, con el filtro AA Adaptative.

El ligth Cache funciona con todos los tipos de luces directas y la indirecta, considera sólo aquellas áreas en una escena que son visibles desde la cámara.

Sample size pone el tamaño de las muestras que tira el light cache y determina el número de rayos proyectados desde cámara hacia la escena para establecer los samples de color. A menos subdivisiones más rápido, menos RAM, menos precisión. Y al contrario: menos rápido, mas RAM y mayor precisión.

Subdivs es la cantidad de rayos o muestras que tira el light cache. Solo cambiaremos el valor si vemos que la escena tiene detalles pequeños que necesitan más atención (a valores grandes genera un acabado suave pero poco preciso). Entonces, si renderizamos a 600 subdivisiones con un simple size de 0,01, le decimos que divida esa pantalla en 600 partes a un 0,01 de tamaño. 



Este render ha sido tirado con un fixed a 4 y adaptative amount a 0. Como puedes ver, ha tardado bastante menos que con un Brute Force-Brute Force y ha reducido el ruido significativamente, obtenido un resultado más limpio.

Los valores subdivs y sample size están relacionados. Si pusiera un valor pequeño en simple size (0,001) y uno pequeño en subdivs (100) no podré generar suficientes muestras en la escena.  En otras palabras, si reduzco el tamaño del simple size tendré que aumentar la cantidad de subdivisiones. Esto se puede ver si seleccionamos Light Cache en motor principal y secundario.


A la izquierda los valores por defecto, a la derecha, con los valores de arriba que he mencionado. Vemos que las muestras son grandes, pero si metemos 0,01 en simple size veremos que no modifica el tamaño de la muestra. Eso sucede porque no tenemos suficientes subdivisiones en el parámetro subdivs.

Si incrementamos a 1000 las subdivisiones nos da más muestras. Eso sí, si aumentamos las muestras a un número excesivo (4000, por ejemplo, y poniendo un simple size de 0,01), el tamaño de las muestras es el mismo y hemos obtenido más información. Sin embargo, hay que encontrar un balance, porque con 4000 subdivisiones los tiempos de render crecen exponencialmente y Light cache está para ahorrarnos tiempo. Normalmente, se recomiendan valores entre 2000 y 3000 en subdivs.


No obstante, existe una fórmula que nos permite calcular la cantidad exacta de rayos para el parámetro subdivs.

Para obtener un buen render con ligth Cache hay que poner muestras (samples) suficientes para poner el 80% de pixeles suficientes. En una resolución de 800x600 tenemos 480000 pixels. Luego aplicamos el 80% que será 384000. Para calcular el nº de subdivisiones le hacemos la raíz cuadrada a 384000 píxeles. Nos saldrá un valor de 619,67, aproximamos a 620, que serán 620 pixels. Dicho valor se pone en subdivs.

En definitiva la fórmula es: √(multiplicar resolución)x80%=pixeles

En el ejemplo: √(800x600)x0,8=619,67≈620 píxeles.

En el render he aplicado la fórmula con la resolución correspondiente. He necesitado 496 en subdivs y he obtenido la misma calidad que empleando 1000.

-Irradiance map. Es un motor exclusivo para muestreo basado en interpolación y renderiza de forma rápida, pero es inestable y consume mucha RAM. Se parece a Brute Force, pero sigue siendo más rápido que ese. Es el muestreador por excelencia en V-Ray y lo utilizaremos de forma habitual.

Para producciones donde no tenemos tiempo debemos usar irradiance map y light cache. Con esta combinación ahorramos tiempo y nos acercamos a resultados parecidos a brute force, pero no iguales. Irradiance map se parece a brute force, pero siendo más rápido. Con brute force trabajábamos a nivel de pixel. Irradiance map hace cálculos a la mitad de la resolución del nivel de pixel. Tenemos menos calidad. Para compensar esta falta de información realiza varios pases. Por ejemplo, el motor hace un pase a la cuarta parte de resolución y el siguiente paso a la mitad, añadiendo adaptatibilidad en aquellas zonas donde necesita más información.

Con irradiance map nos interesa tener la resolución de cálculo por debajo de la resolución final. La falta de información se subsana mezclando las muestras que obtiene, una solución menos precisa que garantiza que no tengamos ruido, reduciendo los tiempos de render.


En la persiana de irradiance map tenemos varios presets. Min rate es para establecer la resolución inicial y para establecer la cantidad de muestras que no necesitan un grado de calidad elevado. Max rate para la resolución máxima y para zonas con más detalle.  Show calc. Phase nos muestra los cálculos que realiza Irradiance Map y siempre hay que tenerlo activado.

Con subdivs metemos más puntitos blancos (de los que vimos con show phases) y logramos más precisión. Con interpolation samples logramos controlar el detalle, pero si metemos valores altos perderemos detalle a cambio de una solución suave, por lo que nos evita usar menos subdivs. Si usamos muchas subdivs e interpolation samples no tendría sentido, porque a más subdivs menos interpolación necesitamos. A mayor subdivs menos interpolation samples. Si tenemos pocos detalles, entonces nos conviene tener menos subdivisiones y más interpolation samples.

Para nuestro caso, podemos servirnos de los current preset que vienen por defecto. En nuestra escena, con un current preset medium obtenemos una calidad de render aceptable que se acerca a Brute Force, pero reduciendo drásticamente los tiempos de render. Sin embargo, si decimos calidad muy baja en GI (very low), nos referimos a que los objetos vuelan por no haber luz indirecta (rebote, muestreo, desenfoque) y por los artefactos (manchitas).

Lo que preocupa es que las manchas se reproduzcan por la escena. Las manchas en irradiance map suelen aparecer en zonas planas. Tenemos que centrarnos en buscar un preset por defecto que las elimine. Un high suele dar buenos resultados, aunque aumenta los tiempos de render, pero no tanto como un brute force.

Os dejo pruebas de render con cada uno de los presets: very low, low, medium, high y very high.







A peor preset notarás que Irradiance map no es tan preciso en sombras y detalles como brute forcée, mientras que a mejor preset Irradiance Map intentará centrarse mejor en los detalles. Es por este motivo que puse la moldura de escayola y los listones laterales para que se notaran los errores de Irradiance map.

Por supuesto, verás que los tiempos de render bajan muchísimo, aunque todo depende del preset por defecto del Irradiance map. Aún empleando el preset de mayor calidad, sigue tardando menos que un brute force y light cache.

No hay comentarios:

Publicar un comentario