29 abril 2016

4.7 V-Ray. Antialiasing

El aliasing son los bordes dentados. Surgen cuando renderizamos la escena y se ve una especie de borde de sierra o borde dentado en la geometría u objetos que usa 3D Studio Max: primitivas, triángulos y líneas.


Para que veas a lo que me refiero, renderizaré la escena a una resolución de 1280x720 con un filtro de antialiasing fixed, todo con los valores por defecto.


Ha tardado menos de 1s en renderizarse. Si haces zoom en cualquier parte de la escena, verás aliasing.

Para solucionar este problema de bordes dentados recurrimos al antialiasing (AA), una herramienta que tiene el motor de render para solucionar este problema. Hay varios filtros para disminuir el aliasing, pero no hay uno mejor que otro (de existir un buen AA, existiría uno sólo). Hay que atender a las necesidades de la escena para averiguar cuál filtro de AA nos conviene.

En esta escena iremos por pasos para disminuir el AA. Pulsamos F10 vamos a la pestaña V-Ray y desplegamos la persiana Image sampler (antialiasing).

Vamos a ver tres filtros: fixed, adaptative y progressive.

-Fixed: es un método de antialiasing no adaptativo. Un AA no adaptativo quiere decir que no aplicará muestras de AA de forma selectiva en zonas donde más necesite y en zonas donde menos necesite.

Vamos a la persiana fixed image sampler donde encontramos un solo parámetro: subdivs (subdivisiones). Lo que hace el AA fixed es renderizar los samples de forma aleatoria mediante un cálculo muy simple: hace el cuadrado del valor que se mete en subdivs y ese será la cantidad de muestras por por pixel que empleará el filtro de antialiasing. Es decir, si yo meto 1 de valor calcula 1*1=1; si yo meto 2 de valor calcula 2*2=4; si yo meto 3 de valor calcula 3*3=9; y así sucesivamente. V-Ray hace esto para evitar trabajar con números muy grandes. Además, nunca podremos meter valores negativos con este sampler de antialiasing.


Para corregir el aliasing debemos subir el valor de subdivs hasta cierto punto. Si metemos un valor de 10, por ejemplo, no hará más que aumentar los tiempos de render de manera desproporcionada, además de que no reducirá el aliasing hasta la perfección absoluta, es decir, no apreciaremos mayor calidad. Por tanto, un valor comprendido entre 1 y 4 es más que suficiente. En esta escena he renderizado con un fixed sin image filter testando con los valores de 1 a 4.




Como ves, la teoría que acabo de explicar se cumple en la práctica.


Los tiempos que ves reflejan lo que tarda el AA fixed dependiendo de valor (donde el último es el de menor valor y el primero el que tiene más geometría en la tetera para solucionar el aliasing). Aunque de lejos se ve bien la tetera, sigue teniendo bordes dentados. Para solucionarlo, tendremos que aumentar la cantidad de caras de la geometría de la tetera para obtener un resultado mucho más suave.


Ahora sí hemos logrado un buen resultado con el filtro de antialiasing.

En resumen, el filtro fixed es adecuado para para texturas muy detalladas, cuando en la escena hay muchos efectos blurry, escenas con desenfoque, profundidad de campo o con escenas que requieran muchas muestras.

-Adaptative: es un método de antialiasing adaptativo que permite al motor de render adaptarse a las necesidades de la escena, es decir, que en zonas que no necesiten mucho antialiasing se use valores bajos y en zonas que si necesite AA use valores altos.

Ahora bien, ¿cómo sé yo dónde debo aplicar más muestras o menos? Normalmente, necesitaremos más muestras para los bordes de la geometría.

A diferencia de fixed, este tiene más parámetros. Para que entiendas los conceptos he insertado una luz V-Ray (VRayLight con 7 de multiplier y un tamaño de 80x80cm) para iluminar la escena (sin usar GI).


La escena ha tardado 17,1s en renderizarse.

Esto es lo que tenemos cuando usamos adaptative.


Según hemos visto, el aliasing se debe a dos motivos: poca geometría (lo hemos solucionado añadiendo más geometría a la tetera) y pocos samples en subdivs (hemos metido 4 de valor), no obstante, tenemos otro factor que contribuye al aliasing: el contraste de color entre texturas. Ahora toma sentido la combinación de colores tan chillona que he escogido para la escena.

Primero, ¿qué entendemos por contraste de color? Es la diferencia de intensidad entre colores. El cián y el magenta son colores más intensos que el gris de la tetera y el suelo.

El contraste de color entre texturas se controla desde el color threshold. El color threshold corregirá el contraste de colores de las texturas hasta eliminar el aliasing, bien acercándose al max subdivs o bien acercándose al parámetro del color threshold. Si comparamos el fixed a 4 y el apatative a 1-4 con threshold a 0,01  vemos que la calidad es similar, pero el tiempo de render se ve reducido.


Color threshold funciona como un tope del filtro de AA; cuando llega al tope deja de tirar samples adaptativos, es decir, una vez que el motor de render llegue al valor establecido (0,01, el valor por defecto) dejará de tirar samples adaptativos. Un valor bajo nos garantiza mejor antialiasing y reducción de ruido, con la contrapartida de aumentar los tiempos de render.

El funcionamiento del color threshold es simple: se realiza el primer pase con el valor mínimo de muestras (los que configuremos en min y max samples), se lanzan y se colocan de manera aleatoria. En segundo lugar, el motor de render calcula el contraste; si está por encima del color threshold lanzará un segundo pase y lanzará muestras donde sea necesario. Si sigue habiendo contraste por encima del color threshold volverá a lanzar otro pase más. Esto seguirá sucediendo hasta llegar al máximo de samples configurado o hasta que el valor de contraste esté por debajo del color threshold establecido.

Con un ejemplo entenderás mejor cómo funciona color threshold.


En este render he usado las configuraciones que vienen en la imagen. En el render no me ha aplicado más samples que los mínimos (1 en este caso), porque al llegar al color threshold establecido no ha necesitado meter más muestras. ¿Qué quiero decir con esto? Que si metes un valor alto en max subdivs y el color threshold es alto, el motor de render nunca alcanzará los 50, porque le ha bastado un solo pase para llegar al tope establecido por color threshold. El resultado: un montón de ruido que no solo afecta a la calidad de mi imagen, sino también al antialiasing. Ha tardado menos en renderizar, por supuesto.


Ahora, con un valor más reducido vemos menos ruido en las sombras, una ligerísima mejora en el antialiasing y un tiempo de render mayor, aunque inferior al render que renderizamos con un filtro fixed.

-Progressive: es un AA que no figuraba en las versiones 2,5 para abajo. Es un sampler de AA parecido al Adaptative, pero en vez de renderizar la imagen mediante buckets (los cuadraditos que aparecen mientras renderizamos una escena), renderiza toda la escena por pases. El AA Progressive es completamente adaptativo, de modo que el Global DMC no se emplea.

La gran ventaja es que se puede ver una vista preliminar de la escena, pero necesitará bastante memoria, sobretodo si ya hemos configurado previamente los render elements. Además, presenta un problema si usamos DR, porque la CPU trabaja bastante más.

Es importante no usar este AA con los flitros de AA Catmull-Rom y Mitchell-Netravali, porque ralentizará el render.

Dicho esto, aquí tienes la ventana del AA progressive:


Min subdivs controla el mínimo de samples que cada pixel tendrá. Max subdivs controla el máximo de samples que cada pixel tendrá. Hay que vigilar que este parámetro no tenga valores extremadamente altos (100 es el que viene por defecto). Si vamos a usar, por ejemplo brute force-ligth cache con 100 en max samples obtendremos un sobresampleo exagerado, de modo que si ya sabemos los mínimos y máximos (como vimos en AA fixed y adaptative), solo tenemos que colocarlos aquí.

Render time es el tiempo que queremos que tarde el render (si el valor está en 0,0, el render no tendrá límite; seguirá tirando pases hasta que nosotros lo detengamos o llegue al max samples), medido en minutos. Ray bundle size es recomendado para DR para controlar el trabajo que hace cada ordenador (a valores altos la CPU de los ordenadores trabaja mejor).


Noise threshold nos controla el nivel de ruido deseable en la escena. Si lo dejo a cero, es como si tuviera un fixed a 4, es decir, tira muestras hasta alcanzar el max subdivs o hasta que se alcance el render time. No obstante, a menor valor (0,001, por ejemplo), menor ruido deseable.

Una pregunta que muchos suelen hacer es si hay valores estándar. La respuesta es no, así que hay que ir tocando en función de unos valores base. Puedes partir de valores orientativos, pero nunca serán estándar. El motivo es muy sencillo: cada escena necesita unas configuraciones determinadas. Es muy seguro que lo que te vale para una escena no valga para otra.

No hay comentarios:

Publicar un comentario