Hsph subdivs e interpolate samples dudas

Hola. Ante todo decir que no soy precisamente la persona más indicada para explicarte todo este tema sin cometer ciertas imprecisiones. Programar un renderer como Vray no es fácil (en realidad es bastante jodido) y las cuestiones técnicas que nos encontramos ante este tema también son complejas de responder.

Dicho esto, intentaré explicarte lo mejor que pueda en que consisten los parámetros hsph. Subdivs e interp, samples.

Empezamos con las hsph. Subdivs.

Básicamente, un raytracer lo que hace es lanzar rayos (primary rays) desde el punto de vista del observador (la cámara) entonces se va viendo cada rayo en que punto colisiona. En un raytracer sin soporte para GI, una vez que el rayo intersecta en un punto de una superficie, se calcula las componentes de la iluminación para dicho punto (Diffuse, Specular). Y listo. En ciertas situaciones en las que se tenga que calcular una reflexión o una refracción, se vuelve a lanzar otro rayo (secondary rays) para llevar a cabo dicho cálculo (en realidad se lanzan tantos rayos como máxima profundidad le demos a la reflexión).

Vale, esto es en un raytracer donde no se soporta GI. Ahora veamos el caso de la GI. Al igual que antes, se lanza un rayo desde la cámara y éste intersecta en algún punto de una superficie. Llegados a este punto es donde se encuentra la gran diferencia entre calcular o no la GI. Sin GI dije que se calculaba la iluminación para ese punto y listo. Pues bien, con GI, lo que hay que hacer es ver la contribución de toda la escena en la iluminación de dicho punto. ¿cómo se hace esto? Pues básicamente lanzando más rayos (secondary rays) desde el punto en cuestión. La pregunta ahora es, ¿cuántos rayos y en que dirección lanzamos dichos rayos? Aquí es donde entra en juego el parámetro hsph. Subdivs. Lo que se hace es que se construye un hemisferio (semiesfera) imaginario sobre el punto actual y con una dirección igual a la normal de dicho punto. Esta semiesfera tendrá tantas subdivisiones como le indiquemos en el parámetro hsph. Subdivs (es como cuando construimos una esfera y le asignamos el número de segmentos). Evidentemente, a más subdivisiones, más rayos secundarios se lanzaran por lo que la GI será de mayor calidad y por supuesto el tiempo de cálculo será mayor. Aquí cabe aclarar que si pones un número de 50 subdivisiones, en realidad no estas lanzando 50 rayos sino 2500, es decir, el número de rayos lanzados será igual a hsph. Subdivs al cuadrado. Otra pregunta que uno se puede hacer es en que dirección salen estos rayos. ¿se distribuyen uniformemente sobre el hemisferio? Lo cierto es que no. Lo que se hace es lanzar rayos aleatoriamente utilizando el algoritmo. Qmc (Quasi Montecarlo).

Para ilustrar todo esto, os adjunto la imagen1 donde podéis ver el punto que se está calculando actualmente (la esfera roja), el hemisferio que utilizaremos para lanzar los rayos secundarios y los propios rayos secundarios.

Como veis en la imagen, algunos rayos impactaran en el muro de la izquierda, otros impactaran en el suelo, otros en la esfera y otros lo harán con el environment que en este caso es de color azul. Así, si un rayo impacta en el environment (color azul), ese azul contribuirá en una determinada cantidad al color del punto que estamos tratando actualmente (el punto representado por la esfera roja). Ahora bien, no todos los rayos contribuyen por igual ya que no todos los rayos llegan a impactar contra una superficie. Bueno, en realidad sí que llegan a impactar todos, pero habrán impactos que se producirán muy lejos del punto en curso y por lo tanto no deberán contribuir al color final del punto. Mi teoría es, y aquí es donde voy a especular un poco ya que no consigo encontrar la ayuda de alguna versión reciente de Vray (tengo la de la v1.0), que el parámetro dist, thresh indica la distancia máxima a la que el impacto de un rayo tendrá efecto. Por ejemplo, imaginad que pongo un dist, thresh de 0,5 unidades. Lo que conseguiré con esto es que los rayos que impacten a una distancia mayor de 0,5 unidades, no serán tomados en cuenta en el cálculo final. Pero como digo, esto es sólo una suposición. Si alguien puede decirme dónde encontrar el manual de la última versión de Vray se lo agradecería.

Ahora voy a intentar explicar el significado de interp, samples.

Vray almacena un determinado número de muestras (samples) en el Irradiance Map. El número de estas muestras y su disposición espacial va a depender de forma directa (aunque no es lo único que determina esto) de los parámetros min, rate y max, rate. Evidentemente, cuantas más muestras se almacenen en el Irradiance Map, mayor será su calidad, pero más tiempo tardará en calcularse. Si os fijáis, Vray, cuando le damos a render, empieza a calcular el Irradiance Map. El número de pasadas que se utilizaran para calcularlo dependen, como he dicho, de los parámetros min, rate y max, rate. Así, si ponemos unos valores de (-3; 0), Vray calculara el Irradiance Map en 4 pasos. Esto lo podéis ver cuando Vray empieza a renderizar, cuando pone current task: prepass 1 de 4, etc. Pues bien, imaginemos que Vray ya ha terminado de calcular el Irradiance Map. Ahora llega la hora de utilizar este Irradiance Map para generar la escena final. Aquí es donde entra en juego el parámetro interp, samples. Lo que Vray hace es que interpola los samples del Irradiance Map. Cuanto mayor sea la interpolación, más suave será la imagen final. Una interpolación demasiado baja, da como resultado los típicos manchurrones. Esto es porque al realizar una interpolación pobre, la diferencia de intensidad entre samples es demasiado acusada.

Para entender mejor esto, mirad la imagen2. En ella podéis observar dos samples sacados del Irradiance Map (desesperados son los colores de los extremos, es decir, el negro y el gris claro). En la fila de arriba, hemos especificado una interpolación de 4, por lo que se generan 4 samples intermedios, resultantes de la interpolación de los samples originales (los 2 de los extremos). En la fila de abajo, tenemos los mismos samples originales, pero en esta ocasión hemos especificado una interpolación de 2, por lo que Vray genera 2 samples intermedios. Ahora, aplicamos un Gaussian Blur (todo esto lo he hecho en Photoshop por lo que no quiere decir que Vray haga esto) a la fila superior y a la inferior (ver imagen 3). Como podéis observar, en la fila en la que hemos utilizado un mayor número de interpolaciones, la transición entre un sample y otro es suave mientras que en la fila inferior, donde utilizamos únicamente 2 samples de interpolación, se nota la transición de un sample a otro, lo cual genera los típicos manchurrones que mencioné anteriormente.

Bueno, pues hasta ahí llego. Espero que te haya aclarado un poco las cosas. La verdad es que explicar esto de forma que se entienda bien es bastante complicado y si encima uno no llega a entender el Vray al 100% (para eso tendría que haber programado un renderer con soporte GI y lo máximo a lo que llegué fue a un raytracer bastante simple) pues aún más. Esto quiere decir que ciertas cosas que he dicho no pueden ser del todo exactas. Si es así, no me molesta para nada que alguien me rectifique. Al fin y al cabo estamos aquí para aprender. Saludos.