This graph shows how many times the word ______ has been mentioned throughout the history of the program.
Este vídeo está patrocinado por la Universitat Politécnica de València.
Y ojo porque el de hoy va a ser un vídeo bastante interesante por no solo los resultados
del artículo que vengo a enseñar, sino porque también vamos a hablar de lo que podría
ser el futuro de los gráficos por ordenador en tiempo real, un futuro que se dibuja con
un camino que empieza con esta imagen.
Vale, es cierto, no es una imagen, realmente es un vídeo.
Y vale, es cierto que tampoco es un vídeo que se haya grabado con una cámara convencional,
sino que, mira, en realidad lo que estamos viendo es una escena por la que podemos mover
la cámara libremente como si de un escenario en 3D se tratase, pero en este caso con objetos
y entornos hiperrealistas, con iluminación y superficies reflectantes reales y que sinceramente
si no me lo hubieran dicho yo hubiera pensado que era un vídeo de verdad.
Entonces, ¿está esto generado tridimensionalmente por ordenador?
Pues sí y no.
Veamos.
Realmente lo que estamos viendo aquí es una escena que ha sido generada a partir de la
información codificada internamente en una red neuronal.
Sí, lo que oyes, una red neuronal.
Red que ha sido entrenada a partir de darle como entrada una serie de imágenes mostrando
diferentes perspectivas de una escena y con el objetivo de que aprenda a interpolar el
resto de perspectivas que no tenemos.
Como si el movimiento de una cámara se tratase, teniendo que aprender así todos los aspectos
de iluminación, paralelaje, oclusión, etc.
Con unos resultados que como ya vemos son impresionantes y que impresionan incluso más
cuando te das cuenta que en todo este sistema no ha involucrado ningún tipo de red neuronal
convolucional o sistema de aprendizaje adversario que normalmente son los que te dan este tipo
de resultados tan impresionantes.
Entonces, ¿cómo funciona?
Pues para entender esto realmente tenemos que hacer un cambio de contexto poco habitual
en el canal para meternos de cabeza en el apasionante mundo de los gráficos generados
por ordenador en tiempo real.
Introducción básica.
Cuando tu juegas a tu videojuego en 3 dimensiones favorito, tu pulsa W, A, S, D, espacio, espacio
al control y mueves el ratón como loco, cambiando así el estado interno del juego, modificando
la posición de los diferentes elementos, personajes, cambiando la vista de la cámara,
etc.
Esto obliga a que el juego en tiempo real deba de recalcular la nueva posición de toda
la geometría del juego, su iluminación, su sombreado, texturizado, partículas y demás
cosas bonitas, para así poder conseguir traducir toda la información tridimensional del juego
en una imagen plana en dos dimensiones que tú pueda ver presentada en tu pantalla.
Es decir, cada segundo se tiene que realizar varias veces la traducción de toda la información
tridimensional de tu juego a cada uno de los píxeles que tú acabas viendo en tu pantalla.
Todo esto en un proceso conocido como renderización.
Y técnicas de renderizados hay muchísimas, potenciadas además por múltiples trucográficos
que lo que buscan es sacar el máximo partido a cada técnica incluso por encima de sus
posibilidades.
Si quieres saber más del tema en profundidad, te recomiendo que veas este mini documental
del canal de Nate Gentile en el que se explica perfectamente.
Pero para el vídeo de hoy me vale con que tengas un acercamiento intuitivo a una de
las técnicas de renderizado que más popularidad han ganado en los últimos años.
Efectivamente estoy hablando del famoso Ray Tracing, o en español, el trazado de rayos.
El trazado de rayos se basa, o sorpresa, en el concepto de rayo, que no es más que una
forma sencilla de modelar la dinámica con la que los fotones interactúan con nuestro
entorno y finalmente con nuestro sistema de percepción, para poder ver lo que nos rodea.
Mira, si por ejemplo yo me encuentro en una habitación, yo veo la luz encendida porque
directamente hay fotones que se emiten desde el punto de luz a mis ojos, algo que podríamos
visualizar con un rayo de luz.
O si por ejemplo yo veo el reflejo de la bombilla en la superficie de mi micrófono, es porque
también hay rayos de luz que se emiten desde la bombilla e impactan con la superficie del
micrófono, donde parte de la luz es absorbida y otra es reflectada en dirección a mis ojos.
Así este proceso se repite con rayos de luz que son emitidos en todas direcciones y que
interactúan físicamente con toda la superficie de la habitación, absorbiéndose, reflejándose,
reflectándose, dispersándose, y que en conjunto, cuando llegan a mis ojos, me permiten percibir,
renderizar el mundo que me rodea.
A grosso modo así funcionaría nuestra misión, y ahora la idea es trasladar esto al mundo
digital.
La técnica del raytracing plantea algo similar a esto, pero en este caso los rayos partirán
desde cada uno de los píxeles de nuestra imagen que queremos componer, y realizaremos
el trayecto inverso para conocer así cuál es el historial de dicho rayo desde la cámara
hasta las fuentes de luz, y así poder tener más información sobre cómo colorear cada
pixel.
Repetiremos esto para un alto número de rayos y BOOM, tu escena estará finalmente iluminada.
Y puede ser que tú todo esto ya lo supieras, porque esto del raytracing tampoco es que
sea algo bastante nuevo.
De hecho, este tipo de técnicas que consiguen renderizados realistas ya se ha venido utilizando
durante años para crear recreaciones arquitectónicas, para crear interiores e incluso para la generación
de películas de animación profesional.
Sin embargo, la principal limitación de este tipo de técnicas ha venido siendo sus largos
tiempos de cómputo, donde cada imagen puede llegar a tardar incluso horas.
Y aquí estaría la clave, y es que si no paramos de escuchar esto del raytracing hoy en día
es porque gracias a los avances en hardware y software de los últimos años, hemos conseguido
acelerar esta técnica hasta poder experimentarla en tiempo real.
Algo donde el sector de los videojuegos está siendo el principal beneficiado.
Pero claro, yo no he venido a hablar del raytracing, podríamos decir que el raytracing es el presente
de los gráficos por ordenador, pero yo he venido a hablar del futuro de los gráficos
por ordenador, algo que nos obliga a hablar de una técnica de renderización quizás
menos conocida.
Toca hablar del volume ray margin.
Que si, esto de lanzar rayos y ver cómo rebotan en cada uno de los polígonos de nuestra escena
está muy bien, pero no es la única forma de poder interpretar todos los datos tridimensionales
que tenemos en una escena a partir del uso de rayos.
Podríamos de nuevo simular rayos que son generados en cada uno de los píxeles de la
imagen que vamos a conformar, pero en esta ocasión, en vez de rebotar en el objeto,
lo que van a hacer es atravesarlo.
Espera, atravesarlo?
Sí, atravesarlo.
Y es que en este caso el rayo va a ir viajando por todo el interior de la geometría para
así poder capturar toda la información necesaria para decidir de qué color colorear el píxel.
Y claro, a lo mejor ahora muchos estaréis extrañados pensando que qué información
puede capturar el rayo si normalmente en la mayoría de escenas tridimensionales que están
conformadas por mallas y polígonos, la mayoría de objetos están como muchos de vosotros,
vacíos por dentro.
Entonces, ¿qué información puede capturar el rayo, qué rayos puede capturar el rayo?
Pues sucede que en este tipo de técnicas, cuando normalmente trabajamos por volúmenes,
realmente no estamos trabajando con objetos poligonales vacíos, sino que aquí estamos
trabajando con datasets tridimensionales, volumétricos, en los que contamos con puntos de información
distribuidos por todo el espacio interior del objeto y nuestro trabajo será darle sentido
a toda esta información para poder conseguir una imagen final digna de ver.
Por hacer una analogía, si nos llevamos este concepto a las dos dimensiones, esto sería
el equivalente a tener una matriz bidimensional que queremos visualizar y donde el rayo accederá
al interior del objeto para ver cuál es la información almacenada en cada celda y poder
convertir dicho valor o valores en un color haciendo uso de alguna función de mapeado
que nosotros hayamos definido.
Coloreando todas las celdas acabaremos conformando lo que normalmente denominamos una imagen
y donde cada una de estas celdas será un bloque elemental de dicha imagen, o en inglés un
picture element o abreviado un pixel.
Y si este concepto lo trasladamos a las tres dimensiones, nos encontramos con la idea del
volume ray margin, donde tendremos rayos lanzados por cada uno de los pixels de nuestra imagen
atravesando un espacio tridimensional para poder saber cuál es la información almacenada
en cada celda en cada bloque tridimensional, volumétrico o abreviado en cada voxel.
La tarea ahora consistirá en, a partir de la información registrada en cada voxel,
decidir qué color RGB y opacidad alfa tendríamos que asignarle a cada celda, al igual que hemos
hecho antes en el ejemplo de dos dimensiones coloreando cada uno de los pixels.
Y ojo, porque para decidir este color utilizaremos lo que se denomina una función de transferencia,
que básicamente te va a coger la información de tu dataset como input y te va a generar
como resultado un color RGB alfa.
Un ejemplo de esto para que entiendas mejor cuál es el papel de esta función de transferencia,
y créeme que este elemento va a ser clave en el vídeo, es imaginarte que nuestro dataset
está compuesto por los datos de haber escaneado con rayos X una cabeza.
Con estos datos, a cada intensidad registrada por los rayos X, podríamos asignarle con
nuestra función de transferencia diferentes colores y opacidades, para así poder conseguir
visualizar distintas partes del volumen de la cabeza.
Cambiando la función de transferencia, estamos cambiando la visualización del volumen de
datos.
Con esta función ahora podrás colorear cada uno de los voxeles en el camino del rayo,
y todos estos colores ahora los podemos agregar para finalmente obtener el color del pixel.
Repites este proceso para cada pixel en tu imagen y habrás obtenido una escena renderizada
por el método del VolumeRailMargin.
Muchas gracias, dale a like, suscríbete, comente…
Vale, quizás te estés preguntando, ¿y todo esto para qué dot?
Pues eso lo veremos en el próximo segundo.
¿Es este el futuro de los gráficos por ordenador?
Pues no, pero agárrate porque vienen curvas.
Y es que no podemos decir que esta tecnología vaya a ser el futuro de los gráficos, puesto
que realmente es el presente.
Esta es una tecnología que también forma parte de la caja de herramientas dentro del
panorama de los gráficos en tiempo real.
Esto lo podemos encontrar en un videojuego, por ejemplo, cuando encontramos una nube volumétrica
o algún sistema de partículas avanzado que simula algún tipo de fluido, o incluso algunos
juegos se han aventurado a utilizar esto para la generación de terrenos o incluso para
objetos y diferentes escenarios.
Pero no suele ser lo habitual, porque realmente, además de muchas de las limitaciones técnicas
que puede tener esta tecnología a la hora de por ejemplo animar personajes, realmente
es innecesario estar almacenando en memoria toda la información volumétrica de un objeto
cuando en realidad podemos conseguir resultados igual de buenos con objetos que están completamente
vacíos y rebotando simplemente rayos en ellos.
Es mejor vivir en un mundo vacío, hueco, de fachadas y apariencias.
Es por eso que esta tecnología suele quedar relegada al ámbito científico, para representar
dataset médicos o para simulaciones o para cosas similares.
Pero, y aquí donde volvemos de nuevo a la inteligencia artificial, esto estaría a punto
de cambiar.
Y todo esto gracias a una tecnología que se llama Neural Radiance Fields, o abreviado
NERF.
Neural Radiance Fields, o NERF, es el paper para el cual realmente os llevo preparando
todo este video y con el cual podemos conseguir resultados tan impresionantes como estos.
¿Cómo funciona?
Digamos que tú quieres capturar una escena, así que el primer paso va a ser tomar diferentes
imágenes registrando unas cuantas perspectivas desde diferentes ángulos.
Digamos que tomas 50 imágenes.
Ahora lo que buscamos es entrenar a un sistema de red neuronal que sea capaz de, a partir
de estas imágenes, generar cualquier nueva perspectiva que le planteemos.
Pues tenemos que volver nuevamente a la renderización por volúmenes.
Si recuerdas, lo que hemos comentado es que la idea es lanzar un rayo, registrar los puntos
de su trayectoria y con una función de transferencia, asignar el color necesario para que la agregación
de todos los puntos del rayo nos acabe generando los píxeles de nuestra imagen.
Pero ¿qué pasa si invertimos el proceso?
¿Qué pasa si, por ejemplo, ahora partimos de una de las imágenes que ya tenemos fotografiadas,
de las que ya habríamos generado?
Ahora en este caso tú ya sabrías cuál es el color que quieres obtener para cada pixel
en tu imagen, y esta información realmente la podrías utilizar para supervisar el entrenamiento
de una red neuronal que aprende a codificar tu escena.
¿Sabías cuando antes te dije que la función de transferencia era un elemento clave en
este video?
Pues mira, en este caso, esta función de transferencia la podemos sustituir por una
red neuronal, que para cada punto en el rayo, para cada voxel, tomará como input las coordenadas
de posición y orientación de justamente ese voxel y realizará una predicción de cuál
debería ser el color que se irradiará en dicho punto.
Inicialmente la red no sabrá nada y por tanto generará colores que no tengan sentido, por
lo tanto los píxeles de la imagen que generemos tampoco lo tendrán.
Pero claro, es que nosotros sabemos cuál es la imagen real.
Con la imagen real y la imagen generada podemos calcular la diferencia para computar así
el error de la red, y poco a poco ir reentrenándola para que pueda ir haciendo mejores predicciones
de cada uno de los colores de los voxeles.
Con esto, poco a poco, según vaya mejorando, los píxeles se irán aproximando y cada vez
la imagen se irá pareciendo más a la imagen real.
Si esto lo repetimos para cada una de las imágenes que tenemos en cada perspectiva,
generalmente acabaremos con una red que podrá predecir correctamente cuál es la luz emitida
en cada punto, permitiéndote utilizar esta técnica incluso para perspectivas nunca
antes vistas.
La red neuronal habrá aprendido a codificar toda la iluminación de la escena.
Y los resultados ya los hemos visto antes, escenas tridimensionales completamente realistas,
que son sintéticas, que han sido renderizadas, pero que al ojo humano parecería un vídeo
real.
Una técnica que sobrepasa notablemente a otras técnicas anteriores que también intentaban
buscar una solución al problema de la sintetización de nuevas perspectivas, y que es capaz de
codificar toda la complejidad lumínica de una escena en una única red neuronal multicapa.
Y esto por ejemplo lo podemos comparar con sistemas similares como DeepView de Google,
que también busca sintetizar nuevas vistas, pero en este caso utilizando una técnica completamente
diferente que está basada en generar los diferentes planos de paralelaje.
En este caso podemos comprobar como el efecto conseguido también es bastante bueno, pero
si te fijas la interpretación de la escena no es del todo correcta, ya que fíjate como
en este caso zonas con reflejos, que realmente deberían de estar en esta posición tridimensional,
realmente son colocados en planos más lejanos, en el fondo, para así poder dar la apariencia
correcta a la hora de mover la perspectiva, ¿lo ves?
Esto lo que nos estaría contando es que este sistema, si bien funciona bien para generar
nuevas perspectivas, realmente no estaría entendiendo correctamente la tridimensionalidad
de nuestra escena.
Y esto es algo que la tecnología NERF consigue hacer a la perfección.
Y fíjate por ejemplo en esta escena como si vamos variando el ángulo de incidencia
del observador, todos los brillos, destellos y reflejos se van comportando de manera natural.
Y esto es fundamental, porque por ejemplo cada vez son más los gráficos hiperrealistas
que consiguen modelar geometrias complejas a partir del escaneado de objetos de nuestra
realidad.
La impresionante demo mostrada por Unreal Engine 5 es un ejemplo de escenarios creados
con este tipo de escaneos que están basados en una técnica denominada fotogrametría.
El uso de la fotogrametría está cada vez más extendido, ya que simplifica enormemente
la incorporación de modelos cada vez más realistas en nuestros mundos tridimensionales.
Pero esta tecnología cuenta con algunas limitaciones, donde la principal es la incapacidad de entender
correctamente todas aquellas superficies que muestran reflejos, brillos y destellos.
En el peor de los casos, estas geometrías serán incorrectamente capturadas, teniendo
que buscar trucos que consigan eliminar estos reflejos en el proceso de toma de fotografías.
Pero es que esto, en el caso de NERF, queda completamente solucionado, porque es el propio
sistema de inteligencia artificial el que aprende a codificar y a generar este tipo
de reflexiones que tanto problema nos está generando.
Entonces, es hora de responder a la pregunta para la que nos hemos ido preparando durante
todo este video.
¿Es NERF el futuro de los gráficos en tiempo real?
Pues… no lo sé.
O sea, diría que no.
Creo que no.
Tanto rollo para que al final digas esto.
Acá ya, que estamos aprendiendo.
A ver, sí, NERF es una tecnología impresionante, y si te fijas de hecho, incluso llega a solucionar
uno de los principales problemas de la renderización por volúmenes, que sería el excesivo uso
de la memoria.
Fíjate que en este caso no tenemos ningún tipo de escena geométrica que tener que almacenar,
no tenemos tampoco un bloque de datos 3D que tener que ir interpretando.
En este caso, nuestra red neuronal que es la que actuaría como función de transferencia,
el único dato de entrada que tomaría sería la propia coordenada de cada voxel y el ángulo
de incidencia, y solamente con esto será capaz de predecir el color de dicho voxel.
Esto significa que realmente el único uso de la memoria que estaríamos haciendo aquí
sería el de almacenar todos los parámetros que conforman a nuestra red neuronal.
Y ojo porque me estoy guardando quizás el dato más impresionante de todo el video,
y es que esta red neuronal solo ocupa en memoria un tamaño de 5 megas.
Es decir, hemos conseguido codificar toda nuestra escena, sus iluminaciones, sus reflejos,
sus oclusiones, todo en 5 megas, un tamaño que incluso ocupa menos en memoria que el
total de imágenes utilizadas para entrenar a este sistema.
Wow.
Pero esto no implica que esta tecnología vaya a competir de repente a sustituir a toda una
industria que ya ha madurado tanto en hardware como en software como herramientas en el desarrollo
de gráficos por polígonos, por mallas y por rayos que rebotan en toda nuestra escena,
siendo además esta una industria que todavía es capaz de sorprendernos año tras año.
Pero bueno, eso no quita que a lo mejor encontremos sistemas mixtos que integren tanto gráficos
con polígonos con gráficos renderizados volumétricamente como ya ocurre hoy en día con el humo, las
partículas, etc.
A lo mejor en un futuro tenemos sistemas con objetos que han sido nerfeados y con gráficos
hiperrealistas y reflejos especulares perfectamente codificados.
O por ejemplo yo creo que esta tecnología podría tener un futuro con mucho potencial
dentro del mercado de la realidad virtual, donde normalmente si suele ser habitual el
escanear toda la escena con fotogrametría para intentar integrarte en espacios que parezcan
realistas.
Así que no.
No creo que Nerf se haya situado como la tecnología culmen en el proceso de generación de gráficos
tridimensionales hiperrealistas, sino que en mi opinión creo que se ha situado en
el comienzo del camino.
Para mí este paper Nerf es como un primer paso bien dado en la utilización de redes
neuronales para la creación de gráficos hiperrealistas.
Un campo que yo creo que se va a desarrollar muchísimo en el futuro y que nos abre el
camino para hablar de más gráficos por ordenador aquí en el canal.
Si este tema le gusta, dejadme unos cuantos likes aquí abajo y así sabré que en un
futuro queréis que hable de un tema tan interesante como es los renderizadores diferenciables.
Y en cualquier caso, si te ha gustado este tema, puedes comentar aquí abajo qué te
parece esta tecnología que estaré ojeando, puede darle a me gusta, compartirlo con gente
que crea que le puede interesar y si te gusta este contenido, puedes apoyarlo a través
de Patreon, donde además tendrás acceso a un grupo de Patreon, donde realmente hemos
debatido muchísimo sobre este tema.
Poco se habla del grupo de Patreon.
Esto es un meme interno, vale?
Y nada más.
Nos vemos con más Inteligencia Artificial en el próximo vídeo.