PROGRAMACIÓN EN 3D LA GPU PRINCIPIOS BÁSICOS PARA NO PROGRAMADORES, NI INGENIEROS

–ACERCA DE LA GPU-CPU,  LOS ALGORITMOS UN RELATO SIN CÓDIGO

Bienvenidos a esta entrada de introducción de temas de tecnología al publico general. Por favor  consideren la presente entrada  será dedicada a personas no programadores ni ingenieros, ni mucho menos matemáticos. Estaré seguro que algunas personas que pretenden ingresar al mundillo podrían encontrar una introducción un tanto interesante. Mientras,  los expertos y profesionales del tema no encontraran mayor profundidad. Pero, sin importar su nivel de conocimiento les invito a enviar sus comentarios o correcciones,  siempre serán bien recibidas.

3d para todos sin programacion

Una mano animada por computadora de 1972, por Ed Catmull y Fred Parke  Universidad de Utah, USA. responsables de PIXART.

Advirtiendo que si bien ya escrito sobre el tema, no tendré mayor reparo en repetir ideas de entradas previas si es necesario con el fin de construir una entrada solida.

Los curiosos no encontraran un conjunto de  “Tips” para comprar lo último en GPU  y CPU, pero tal vez podrían llegar a entender cómo llegamos a esta locura.

Vivimos en una sociedad profundamente dependiente de la ciencia y la tecnología y en la que nadie sabe nada de estos temas. Ello constituye una fórmula segura para el desastre. –Carl Sagan

RESUMEN DE TEMAS:

Iniciaremos con un tema recurrente en este blog: el misticismo tecnológico.  Luego unos  breves principios de historia de la maquinas computación  y su software o algoritmos, con unas breves explicaciones sobre los lenguajes de programación y los cuellos de botella. Repasaremos el bucle del software vídeo juego y los tipos de periféricos para generación de vídeo (Texto, TILES+SPRITE y VRAM).  Una vez explorados los temas base iniciaremos  los temas de larga exposición acerca mundo 3D en tiempo real, explorando el proceso de RENDER sin matemáticas ni algoritmos.  Finalizaremos con los temas más relevantes de la GPU y su evolución .

INTRODUCCIÓN- SUPERANDO LA SUPERSTICIÓN Y MISTICISMO DE LAS MÁQUINAS

Estas entradas tienen como objetivo desvirtuar el misticismo y la superchería en tecnología de vídeo juegos. Me gusta pensar el marketing y el pos-marketign ofrecen un enfoque superficial del vídeo juego moderno con ideas como el producto experiencia  y promociona la idea de  la potencia computacional.

misticismo tecnologico.jpg

Si continuamos a este paso terminaremos creyendo que las computadoras fueron inventadas por extraterrestres, tal como creemos lo fue con las pirámides. Por tal motivo les invito a resolver este tema del misticismo y superstición en los temas abordados por el marketing y el vídeo juego mediante los dos (2) siguientes síntomas:

  1. La perdida de conexión entre la tecnología y las personas que la adquieren, a tal grado que muchos países han abandonado la producción de tecnología y ciencia en favor de un pequeño pero seguro retorno de las inversiones económicas. Entre otros interesantes dilemas modernos.
  2. El vídeo juego no es REALMENTE como una caja cerrada de mecanismos descocidos, o por lo menos desde la perspectiva “material” la idea no es prometedora. Debiendo meditar que el proceso de planteamiento de la máquina es como tal un conjunto finito de posibilidades.  Por consiguiente es imposible mantener la idea de que existen infinitos caminos para resolver el problema de construir una  máquina computacional de cualquier tipo, incluidas las especializadas en los  vídeo juegos.

En resumen todo la computación y los vídeo juegos agrupan soluciones estandarizadas. De igual manera  los algoritmos o software  son paradigmas,no son aceptadas en un número infinito siendo derivadas de  las técnicas aceptadas por las máquinas.

También me lleva a otra cuestión importante, todo lo que les deseo contar no tiene nada que ver con desarrollar vídeo juegos, pero si son problemas intermedios que van en esa dirección.

Recomiendo a ustedes revisiones previas o complementarias:

MÁQUINA DE COMPUTO Y EL PROBLEMA ALGORÍTMICO – DESCAFEINADO…

Durante muchos siglos siempre como humanos hemos prestado un desbordado interés de ser creadores de  artefactos mecánicos automáticos, en especial una afortunada obsesión   para construir una máquina que nos permitiera resolver cualquier tipo de problema.

La opción clara durante largos milenios fue construir la máquina mediante engranajes, correas y piñones. El ejemplo más notable fue la  “máquina analítica” en el siglo XIX,  varios siglos atrás ideada por el Sr. Babage y  la Srta. Ada Lovelance.


Maquina de cálculo basada en las ideas del Sr. Babage. Fuente de la imagenpinimg.com

Gracias a la máquina de Babage podríamos en resumen dividir arbitrariamente el problema de la máquina de Computo en dos (2):

El primero es claramente construir la máquina, que abordaré superficialmente  en el siguiente apartado .

El segundo problema es cómo comunicar a la máquina  los problemas a resolver y nos permita obtener respuesta al problema especifico.  Aun cuando nos parezca extraño fue lo primero a resolver. Ada Lovelance  en el caso de la máquina de analítica retomó la vieja idea del “algoritmo” o la de  dividir todo problema en pequeños pasos a  manera de optimar los problemas e insertarlos en la máquina.  Es lo que conocemos como solución algorítmica o software. 

Esta es la solución o ALGORITMO permitió a cualquier máquina de computo resolver  problemas matemáticos Fuente de la imagen wordpress.com

Visitar:

LENGUAJE DE MÁQUINA Y LA MÁQUINA..O ..LA BRUJERÍA DE LA COMPUTACIÓN

Debemos repasar por lo menos dos soluciones para construir  una buena máquina de computo en especial la de Von Neumann.

 En principio podemos construir sistemas para resolver algunos problemas matemáticos, mediante variados dispositivos; bien sean Engranajes, Réles, Tubos electrónicos o Transistores. La primera opción es construir sistemas fijos, conectando los dispositivos y generando unas  ecuaciones (puede ser álgebra de boole de 1 y 0). El sistema nos dará respuesta a la velocidad de los electrones,  no es la velocidad de la luz, pero es mejor que un calculo manual.  El sistema nos permitirá  variar los parámetros de entrada y obtener varias alternativas o escenarios de evaluación útiles.

analog computer old pics archive Enginner Karen Leadly.jpg
Engineer Karen Leadlay trabajando en una compuadora análoga Space General Dynamics, 1964

 La  gran contribución del  Sr Alan Turing fue pensar en sistema de soluciones mediante maquinas que responden con cambios de sus entrada (maquina de estados). Son similares a puertas automáticas o una barrera de un parqueadero. La maquina de Turing es un complejo artilugio mecánico que se puede programar, es decir no requiere re-cablear la solución, es completamente “programable”.

Turing machine 1.JPG

La segunda propuesta y exitosa fue dada por el Sr. Von Neumann, desde donde surge todo cuanto  conocemos como computación.  La máquina de Neumann no es distinto de una fábrica; asegurando ciertos espacios para el ingreso la información, ciertos espacios para almacenar, lugares para procesar y además los mecanismos para su traslado.

Esquema del la computadora de Von Neumann (1940). Fuente de la imagen Wikipedia.

El trabajo del Sr.Von Neumann fue el de centrar el trabajo de la máquina en una calculadora mediante una ALU o UNIDAD ARITMÉTICO LÓGICA a la cual dar las instrucciones. Como consecuencia requerimos de pequeños espacios de entrada para el almacenamiento a los que denominaron REGISTROS

alu
Fuente de la imagen: http://fundamentos-infor-matica.blogspot.com.co/

Las  INSTRUCCIONES para la máquina de Neumann son las de la calculadora o ALU (operaciones aritméticas), a las que sumamos las que afectan el movimiento de datos de los registros que incluyen una diversidad de opciones como adulterar los bits individuales, mover bloques de memoria y  generar saltos condicionales entre líneas del programa.

Existen muchos aspectos físicos en la electrónica de la CPU, pero  no entraré en  detalles.
Fuente de la imagen: slidesharecdn.com

Las  instrucciones  son en realidad secuencias de variaciones de voltaje (tensión) y las hicimos similares a los números binarios. Para almacenar los números binarios o instrucciones  la primera opción  fue rescatar las máquinas perforadas de los viejos  telares o TARJETAS PERFORADAS, posteriormente cinta magnética y luego los discos ópticos.

telar-de-jacquard
Fuente de la imagen: http://www.roboprosl.com

Antes de continuar, existe un problema con el ábaco tipo ALU. Las operaciones solo suman números enteros, como los tomates y las manzanas que no son fraccionarias ni irracionales. Operaciones adicionales les debemos programar, escribiendo un algoritmos o software. Un ejemplo de la evolución de las capacidades de las ALU las encontraremos en los viejos procesadores 486 del fabricante INTEL en conjunto con procesadores adicionales de mayor precisión numérica o coma flotante.

En este caso un número en coma flotante la “,”  puede variar para dar mayor precisión al número.

mantisa es la diferencia entre un número y su parte entera. http://itm201511.webnode.es/arquitectura-de-computadores/punto-flotante/
Co-Procesador matemático encargado de la matemática compleja en los primeros procesadores. Procesador Intel 80386DX CPU + Coprocesador Intel 80387DX. Fuente de la imagen: Wikipedia

EL RELOJERO LOCO……BOTELLAS Y SUS CUELLOS ELEGANTES..

Casi lo paso por alto el tema de los MEGA HERCIOS (MHz = millones de oscilaciones por segundo). El procesador lee las instrucciones a una velocidad (frecuencia), dependiendo de la complejidad de la instrucción pueden tomar de 1 CICLO a 3 CICLOS de reloj. La velocidad es limitada por la respuesta  de los semiconductores , los arreglos internos de los transistores que lo componen.

La analogía kindergarten del reloj es el tipo  que nos da látigo cada segundo para que te muevas más rápido. Si no te da látigo pues paras pero  a mas látigo más rápido.

La analogía funciona aun a pesar del un pequeño problema en nuestro mundo moderno; cada parte del computador quiere ir a su ritmo y con diferente ancho en sus autopistas (buses de datos). A consecuencia, SI cada uno de los componentes trabajan a una frecuencia diferente es posible y producen “trancones/embotellamiento/atascos” entre los datos que cruzan de lado a lado, lo que podríamos llamar como cuello de botella.

Fuente de la imagen: Taringa

Visitar:

VÍDEO CONSOLA COMO COMPUTADORA Y VÍDEO JUEGO COMO SOFTWARE…  EL RETORNO AL ALGORITMO

Repasemos este enredo con el tema en cuestión. Tenemos una máquina que es una computadora y le llamamos vídeo consola, a la que le introducimos un software especializado y le llamamos vídeo juego. La computadora solo entiende números binarios  como instrucciones aritméticas y modificaciones de los registros. A esta particular máquina le ingresamos datos por medio de interruptores (botones) y potenciométros (sticks) y como resultado obtenemos líneas de vídeo y sonido.

LENGUAJE DEL VIDEO JUEGO

Regresamos a la máquina y su lenguaje. Si lo pensamos detenidamente la verdad no tiene mucho sentido escribir en lenguaje  en niveles de tensión (0 o 5 voltios)  y de paso obviaríamos el uso del lenguaje de manipulación de los registros (BAJO NIVEL o ENSAMBLADOR).  Bien no es preocupante, lo hemos  solucionado, dado que la misma teoría de la máquina (Esencialmente las ideas de  Turing) permite construir un lenguaje un poco  similar al nuestro o de ALTO NIVEL.

Fuente de la imagen: Formas de Ejecutar Instrucciones en Microprocesador INSTRUCCIONES EN EL MICROPROCESADOR:

 

El uso de un lenguaje de ALTO NIVEL resolvía el dilema, requerimos un software que hace la vez de  traductor (COMPILADOR) para resolver la traducción a la máquina. Los lenguajes de alto nivel nos permitieron construir un software base  para comunicar nuevo software a cada solución de hardware  y administrar los recursos, le conocemos como SISTEMA OPERATIVO.

Fuente de la imagen: aprenderaprogramar.com

En resumen, un lenguaje parecido al de los humanos nos permite  comunicar a la computadora las instrucciones mediante cortas palabras. Podemos asimilar este como lenguaje humano, pero recuerden no es una clase de programación es sobre el relato del software lúdico.

VÍDEO JUEGO  Y BUCLE: PRINCIPIOS BÁSICOS….

El algoritmo base de todo vídeo juego es un bucle, el cual finaliza uan vez completado   completamos los objetivos programados. Este Bucle de juego moderno (un solo hilo) consiste en: Iniciar, Cargar contenido, Dibujar+Actualizar.

Bucle de juego de Anatomy of a XNA project, http://iloveshaders.blogspot.com.co/

Mucho antes de esta locura de las gráficas los vídeo juegos eran escritos por sus propios usuarios a partir de largos listados como los descritos en “101 Great Game To play” del año 1978.  Pero, un  vídeo juego simple como los mostrados en   “101 Great Game To play”   no parecen ser del interés de muchos de los usuarios modernos, pudiendo tener problemas con algo tan minimalista: sin gráficos ni sonido.

Catálogos de código de vídeo juegos encontraran en abundancia. Fuente de la imagen: http://www.visualnews.com

Debemos complementar la idea del bucle de juego separando el trabajo del hardware (periféricos) y software (código):

  • HARDWARE ESPECIALIZADO (PERIFÉRICOS):  Dibujar, Generar sonido y almacenar información
  • SOFTWARE EN LA MÁQUINA DE COMPUTO:  Verificar los estados y metas, mover adversarios, físicas.

El resto de la entrada consitirá mostrar las opciones básicas para generar vídeo desde la máquina. Para acortar el relato debo resumir de manera arbitraria los cuatro (4) tipos de tecnologías o paradigmas para dibujar gráficos: Modos de texto, TILES/SPRITES, MATRICES DE VÍDEO y  finalizando con el largo apartado para las 3D o la GPU.

LA MÁQUINA DE VÍDEO..EL GRAN ALIADO..

Como entenderán el Sr. Babbage pensó en una máquina no hubiera pensado siquiera en que estas pudieran generar imágenes,  incluyendo al Sr. Turing, Von Neumann y el largo etcétera de los pioneros en el campo.

Construir una máquina para la generación de gráficos requiere el desarrollo de los  tubos de rayos catódicos (CRT) y la TELEVISION (TV). Igual nos lleva a otro punto, las computadoras no escriben directamente en el CRT. En principio podemos entenderlo con el hecho que los MHZ en un computador primitivo no tienen suficiente velocidad para dibujar figuras distinguibles, no quiero decir que no sea posible con un mayor número de MHZ, solamente fue una solución pasada por alto evitando sobrecargar el procesador primitivo.

tv-cathode

Una opción fue entonces en estas  primitivas computadoras la de construir un nuevo  elemento que hiciera de intermediario entre el procesador principal y el CRT, orientado original mente a generar CARACTERES de grandes tamaños.

Steve_Russell_and_PDP-1.png
Fuente de la imagen de Spacewar! for the PDP-1  en https://archive.org/

Ahora bien, si investigan a fondo la computadora como la  PDP-01  o el contenedor del primer vídeo juego “computarizado” conocido como SPACE WARS! del año 1962 encontrarán  la opción de modificar la información enviada al CRT, pero considérenlo como un ejemplo en extremo primitivo y rudimentario.

borrar

Mediante el bus de datos se puede conectar un nuevo circuito electrónico (periférico)  colaborando con el trabajo de dibujar información en una pantalla.

TEXTO..Y MÁS TEXTO ..MODOS DE TEXTO..

En los modos de texto permite dibujar caracteres en pantalla mediante un número fijo de columnas y filas,  estas máquinas no pueden generar gráficos pero pueden dibujarse formas primitivas con ayuda de caracteres especiales.

Cada uno de los caracteres son guardados en una pequeña ROM,   asociados 8 bits de representación  (Código ASCII), son dibujados linea a linea los contenidos almacenados en una pequeña  memoria dedicada a almacenar los caracteres a representar en el CRT.

Character generator scheme.svg
Fuente de la imagen Wikipedia.

TILE MAPS y SPRITES..

Con la técnica de SPRITES-TILES, usada en el mundo de las vídeo consolas primitivas. Las imágenes observadas LINEA A LINEA de video a partir de espacios de memoria desde un rompecabezas, pequeños mapas de bits. No podremos dibujar nada diferente a los dos recursos citados.

Los TILES  pequeños cuadros  que componen un fondo, como un rompecabezas. Cada TIILE es definido en píxeles generalmente 8×8 o 16×16.  El procesador gráfico ensambla el fondo mediante una tabla o TILE MAP. Los SPRITES son algo muy intuitivo al vídeo juegador, como las figuras del avatar y los rivales, igualmente se pueden componer de pequeños cuadros con la particularidad de poderles mover en la pantalla.

Los TILES y los SPRITES  generalmente guardados en la ROM (CARTUCHO) y el procesador gráficos encarga de dibujar  los recursos que la CPU le ordena. La ultima consola en usar aquella primitiva técnica fue la Game Boy Advance (GBA).

IMAGEN MATRICIAL ..HEGEMONÍADE DE LA  VRAM

 Como locura proviene del mundo de los computadores personales (PC, mini y micro computadoras). Cualquier elemento que queramos dibujar debemos mantenerlo en una memoria intermedia. Es desde donde provienen los  famosos “PIXELES”. Lo primero fue usar  la vídeo memoria principal como espacio para el dibujo, al no ser eficiente fue necesario trasladarlo a un espacio separado  o VÍDEO RAM (VRAM).

earlyvideo

Es un gran avance en ciertos aspectos, que conllevó a muchas limitaciones  para los juegos clásicos en PC AT/X,  obligaba a programar líneas para cargar los dibujos desde el disco a la memoria principal, de paso cientos de líneas de código adicional de CPU para asimilarlos como TILES o SPRITES. En otras palabras,  no solo perdemos  grandes cantidades de RAM, ademas perderemos mucho de nuestro tiempo en solventar los problemas de cargar desde imágenes de los  archivos y llevarlos a la RAM.

Ahora bien, en los sistemas contemporáneos con GPU es prácticamente imposible acceder a la escritura de la RAM a favor de construir nuevas estructuras llamadas polígonos, de los cuales hablare un poco adelante.  Es un plano intermedio que simula un viejo sistema 2D, y  facilita la representación como TILES o SPRITES, a partir de texturas en pequeños polígonos.

Un paso intermedio se vio con el bum! de los entornos gráficos. Recuerdo cuando programaba para las versiones primitivas de los sistemas de ventanas como MS-Windows (3.1) encontraba un espacio de dibujo, no permitía la escritura en RAM,  sino como una pizarra de dibujo llamado CONTEXTO DE DISPOSITIVO. Ahorrábamos los procedimientos de carga de imágenes, pero los procesos eran tan lento que no permitía componer animaciones fluidas.

SkiFree por Chris Pirih un video juego popular para OS Windows 3.1.  Fuente de la imagen staticflickr.com

NOTAS SOBRE EL COLOR…RAM Y PALETAS

Las memorias  RAM  desde siempre han tenido un costo  económico considerable. Lo mejor siempre es ahorrar tanta cómo es posible. En los primeros modos de vídeo  dibujamos  con un pequeño número de colores a la vez con la ayuda de un recurso llamado “PALETA”. Un ejemplo clásico del VGA son 256 colores para componer las imágenes en pantalla. En los esquemas modernos de color cada componente Rojo, Azul y Verde (RGB) almacenan en bits independientes, por consiguiente son costosos en espacios de memoria

Fuente de la imagen: http://webstyleguide.com

Referencia importante: Muchas de las imágenes e información son tomadas de http://www.scratchapixel.com/ pagina que invito a visitar.

VENGAN PASEN!! 3D PARA TODOS!!!

Antes de iniciar quiero separar los temas en gráficas 3D. Advierto amablemente, solo abordaré la introducción a estos temas en técnicas  “en tiempo real” o  propias de uso en  los vídeo juegos. Queridos amigos es una gran limitación referente al universo de técnicas y algoritmos 3D en computadoras, ademas de ser  muy favorable para delimitar el tema. También comprenderán existe un limite temporal de la entrada y es justo al borde del inicio de las GPU con sombreadores programables.

RESUMEN: Realmente, esta bujería es una aplicación práctica de matemática de matrices en un espacio tridimensional ( ejes X,Y,Z). Cada punto en el espacio 3D es transformado a un nuevo plano de pantalla de vídeo, no distinto a una pintura que usa perspectiva. Así que toda esta locura es posible entenderla como el dibujo de mallas o líneas a partir de solo información de puntos o  VÉRTICES que son coloreados y modificados para mostrarlos en una pantalla.

Fuente de la imagen: Image synthesis and OpenGL: graphics pipeline

COORDENADAS Y MATRICES..

El Sr. René Descartes en el siglo XIV propuso dividir el espacio físico real en un sistema de coordenadas, en otras palabras como un conjunto de puntos separados entre ellos por una distancia idéntica y con un punto de origen [0,0,0].  El dilema no es tanto que exista este espacio 3D, el dilema esta en reducir el problema de “trasladar” cada punto 3D en un “lienzo”  (CANVAS/VIEW PORT)  o la pantalla de un ordenador.

Sistemas de coordenadas
Fuente de la imagen: https://msdn.microsoft.com

Vamos a ver si puedo explicar las matrices sin mucho texto, espero que los matemáticos me perdonen!!

No es una clase de matemática, pero si pretendo hacer una buena introducción debo dedicar las siguientes líneas a explicar superficialmente de que va todo el tema de  “las matrices”. Las matrices parten realmente del ÁLGEBRA LINEAL. Si  la recuerdan es  aquella matemática en donde tenemos varias ecuaciones con varias variables de las cuales deseamos obtener una solución.

{\displaystyle \left\{{\begin{array}{rcrcrcr}3\,x_{1}&+&2\,x_{2}&+&\,x_{3}&=&1\\2\,x_{1}&+&2\,x_{2}&+&4\,x_{3}&=&-2\\-\,x_{1}&+&{\frac {1}{2}}\,x_{2}&-&\,x_{3}&=&0\end{array}}\right.}  FI.Wikipedia

Para obtener una MATRIZ lo que debemos hacer es deshacernos de todas esas letras (variables) y quedarnos con los números (coeficientes).

{\displaystyle {\begin{bmatrix}a_{11}&a_{12}&\cdots &a_{1n}\\a_{21}&a_{22}&\cdots &a_{2n}\\\vdots &\vdots &\ddots &\vdots \\a_{m1}&a_{m2}&\cdots &a_{mn}\end{bmatrix}}{\begin{bmatrix}x_{1}\\x_{2}\\\vdots \\x_{n}\end{bmatrix}}={\begin{bmatrix}b_{1}\\b_{2}\\\vdots \\b_{m}\end{bmatrix}}}  FI.Wikipedia

Lo que descubrieron muchos inquietos matemáticos es que al usar solo las matrices era posible transformar la información entre varios espacios dimensionales, en nuestro caso  el 3D y el 2D. Cuando tenemos un punto 3D definido mediante P [x,y,z] podremos construir una matriz T de transformación y la idea es que al multiplicar puntos  tendremos una nuevo espacio punto en nuevo espacio  P’ .

Con el uso de matrices reducimos increíblemente plantear los problemas en 3D. La moraleja por ahora es un tanto que: deberíamos aprender a multiplicar matrices, pero, este NO es el blog adecuado para ello.

¿Cómo se relaciona con la GPU?
Aunque pareciera complicado, solo debemos implementar una vez las operaciones con matrices como un nuevo tipo de instrucción. Es posible claro construir estas operaciones en  lenguajes  de programación de alto nivel,  sin embargo sinceramente es absurdamente ineficiente y solo considerarse a nivel académico.

Las matrices T de  transformación son útiles para:  MOVER, ROTAR, ESCALAR y TRASLADAR puntos en el espacio 3D.

Fuente de la imagen: http://math.hws.edu/graphicsbook/c3/s5.html

Mediante matrices de 4 filas por 4 columnas podemos realizar todas las operaciones en el espacio 3D.

CÁMARA, FROSTUM Y PROYECCIÓN….

La solución para trasladar un punto 3D a una pantalla 2D  (plano) es construir una cámara imaginaria, palabras más palabras menos. Cuando tenemos un punto en el espacio 3D y nuestros ojos están en el centro (foco)  este punto puede ser proyectado en un punto de un plano frente a nuestros ojos o LIENZO (VIEW PORT).  Lo podemos interpretar como  PERSPECTIVA, herramienta usada desde tiempos inmemoriales en la pintura.

Perspective transform diagram.svg
 Fuente de la imagen Wikipedia 

Para encontrar los nuevos puntos en el plano usaríamos usualmente trigonométria, o de la relación entre el largo de los lados de triángulos y sus ángulos

Fuente de la imagen Wiikipedia

Si recuerdan un poco sus clases de dibujo, es posible definir un punto (fuga) en donde convergen imaginariamente todas las líneas de un objeto observado.

La matriz que nos permite pasar del mundo 3D al pantalla 2D es la MATRIZ DE PROYECCIÓN. Podríamos entender esta matriz como aquella que ubicados  unos puntos 3D para que esta simule el fenómeno de la perspectiva. Ahora bien, como la idea es simular los elementos que captura la cámara virtual, simplifica el modelo si imaginamos una escena encerrada dentro de una  figura 3D denominada FRUSTUM, una pirámide a la cual hemos recortado en su lado puntiagudo,  la punta realmente es donde ubicaríamos uno de nuestros ojos y el corte, similar a un lienzo.

 

Fuente del a imagen http://www.real3dtutorials.com

FROSTUM es una figura imaginaria que nos permite delimitar las capacidades de nuestra cámara imaginaria, soluciona el tema de la perspectiva y reducimos el número de objetos a representar eliminando aquellos que no son encerrados por la figura (CLIP o CLIPPING).

Sin embargo, la CÁMARA no es un objeto fijo,  la MATRIZ DE PROYECCIÓN en conjunto con la MATRIZ DE VISTA (VIEW MATRIZ) permite trasladar cada uno de los puntos 3D al punto correcto o espacio de la cámara. Todos los puntos viven felices en su lugar pero si queremos verlos debemos trasladarlos a la cámara para luego capturarlos en el lienzo, pero es claro que los puntos que están antes de el lienzo o después de la FROSTUM no nos interesará dibujarlos.

“Al  Multiplicar todo por la matriz de proyección tiene el siguiente efecto.” Fuente de imagen y texto http://www.opengl-tutorial.org

Visitar

ES HORA DE COMENTAR ALGUNAS VAGAS IDEAS SOBRE LOS POLÍGONOS….

El polígono o figura geométrica  más sencillo que conocemos es la conformada por  tres (3)  puntos, si pensaron en el TRIANGULO, adivinaron.  A cada punto le llamaremos VÉRTICE. Cada uno de aquellos vértices son construidos en punto arbitrario o  el  ESPACIO DE MODELO (MODEL/LOCAL CORDINATES)

Fuente de la imagen Wikipedia.

Con un conjunto de polígonos tipo triangulo podemos construir figuras complejas, a mayor número de triángulos la imagen se observará con mayor realismo, pero con un mayor coste computacional.

Al usar triángulos nos vemos absortos a limitaciones y es el orden de define cada uno de los vértices que no pretendo explicar, pero si puedo comentarles  una vez que definimos 3 puntos y les tenemos en el espacio de proyección solo nos faltan  trazar las 3 líneas y es en ese instante en el que veremos el polígono en pantalla.

Resultado de imagen para poligono triangulo 3d opengl

SOLO SOMOS PUNTOS EN EL ESPACIO…

 

Diagram of how world coordinates and local coordinates are related
Fuente del  imagen MSDN

Solo nos falta la MATRIZ MUNDO; en los que incluimos las operaciones rotación, traslado y escalado. Es la que define en “donde” ubicaremos cada uno de los vértices  respecto al resto de elementos que pretendemos dibujar.

Un ejemplo sencillo es cuando  tenemos un modelo de una palmera y tenemos muchas palmeras iguales, pues cada una de las palmeras es un único modelo  con diferentes ubicaciones, escalas y rotaciones en el mundo 3D.

 

Fuente de la imagen: http://animium.com

DEL 3D A LA GRAN PANTALLA..DE LA TV

Retomemos la idea del lienzo. Como entenderán la  pantalla de ordenador es un conjunto ENTERO y FIJO de puntos de  PIXELES,  tambien conocido como IMAGEN RASTER o  matriz de puntos de pantalla en dos dimensiones (2D).

Todo lo que capturamos en la matriz de proyección en especial en el LIENZO es convertido a el nuevo espacio 2D. El tamaño de la pantalla o la  RESOLUCIÓN;  el número de píxeles verticales por número de píxeles  horizontales.

Antes de continuar, recordemos que el punto de origen de una pantalla siempre es la esquina superior izquierda, el eje X es la linea horizontal y el eje Y es la vertical, el valor se incrementa en la medida que nos alejamos del origen.

Y aun cuando no parece intuitivo, es una de las grandes discusiones en el 3D en tiempo real,  el calcular un mayor número de puntos en la pantalla y relacionado con el nivel de detalle de la escena.

Nota 1: IMAGEN RASTER es diferente de RASTERIZACIÓN 3D, que describiré brevemente  líneas adelante.

Nota 2: NDC (Normalized Device Coordinates), coordenada normalizadas. Consiste en convertir los valores de la matriz de proyección en  valores  de  0 hasta 1, como un  paso intermedio entre el espacio del lienzo y el espacio de pantalla.

Resumamos un poco sobre como dibujar polígonos:

Fuente de la imagen: https://learnopengl.com/

Los vértices ingresan a un proceso consecutivo de transformaciones que explicaré a continuación:

  • En el espacio de modelo (local space) es donde arbitrariamente definimos nuestras figuras o conjunto de vértices.
  • El espacio de mundo (world space) es el espacio final en donde ubicaremos el modelo.
  • En el espacio de vista  (view) es a donde movemos todos los puntos antes de la matriz de proyección. Esta matriz de proyección  (porjection) simula la perspectiva y de paso nos permite eliminar los elementos que no ve la cámara.
    • Es en este punto en perspectiva que los conectamos mediante líneas y es lo que observamos como una malla.
  • Finalmente en el lienzo o pantalla (viewport tranform to screen) es realmente en donde redondeamos los valores  en el plano de cámara (lienzo), representados en una arreglo de memoria RAM , de allí solo queda transportarlos uno a uno (comunicación serial) a la pantalla (VGA, HDMI, etc).

Con ello podríamos hacer unos gráficos muy primitivos  mal llamados MESH (MALLA) o WIREFRAME (modelo de alambre). Por lo que debemos continuar con algo de color para los primitivos polígonos.

 VECTOR NORMAL Y …SOMBREADORES ..

Definición,  Vector: Una linea con magnitud  finita y dirección (orientación en el espacio)

Fuente de la imagen: imgur.com

Es claro que si le damos la vuelta al triangulo de una figura que parece solida no vemos en la vida real detalles de su interior. Para definir el derecho del triangulo usaremos algo  llamado VECTOR NORMAL o brevemente N, nos quedaremos con la idea que es el vector perpendicular a la superficie del triangulo, no es complicado de calcular, no es física nuclear, pero no es clase de matemáticas. Nuestra cámara al apuntar al LIENZO  tiene un vector normal  y al calcular el ángulo entre ellos nos dará idea de si el polígono es visible a la cámara o si vemos la cara inversa  y por tanto no lo veremos (FACE CULLING).

Fuente de la imagen: cern.ch

Este vector normal es útil para atender al tema de la iluminación y los sombreadores. Si imaginamos por un momento la luz como un rayo,   golpeara el polígono y revotara hasta llegar a la cámara, al evaluar  el ángulo (al igual que con la cámara) matemáticamente nos dará una idea de que tan oscuro o “sombreado” le observaremos. Olvidaba a esta técnica es denominada como sombreado plano (FLAT) y no es muy bueno si tenemos muy pocos polígonos en nuestra figura.

. Fuente de la imagen Scratchpixel.com

En esta imagen el punto de luz es el mismo de cámara, observamos que los puntos alejados se oscurecen

Con el objetivo de mejorar el resultado del sombreado el Sr. Henri Gouraud pensó que era un poco mejor en lugar de usar un único vector normal calcular (interpolar) la variación de color entre triángulos vecinos.  Mientras que el Sr.  Bui Tuong Phong  considero estimar el sombreado desde vectores normales en cada uno de los vértices.

../../_images/flat-gouraud-phong.png

../../_images/comparison.png

Fuente de las imagenes: http://opengl-notes.readthedocs.io/

Esto nos lleva la pregunta ¿Qué es un SOMBREADOR (SHADER)?, en este nivel de reducción es tal vez una aproximación matemática a un problema de iluminación y no simula la trayectoria de la LUZ tal como la conocemos, por lo que deberíamos  pensar en ellos como un truco cuyo objetivo es  simular el comportamiento de la luz al impactar algún tipo de material especifico.

Visitar:

AHORA LO VES AHORA NO LO VES…RASTERIZACIÓN Y Z-BUFFER…

VES Awards 89 cropped.jpg
Foto del señor Catmull

En este punto debemos rescatar  a un ilustre personaje en la computación gráfica el Sr.  PhD Edwin Catmull, podríamos decir que es el padre de toda esta brujería. Uno de los grandes descubrimientos de Sr. Catmull fue:  adivinaran; si el invento eso de lanzar rayos  a los triángulos  (polígonos). No lo comente antes para no dañar la sorpresa.

Si quisiéramos saber que es o no visible desde nuestro punto de vista solo podríamos lanzar un rayo desde nuestro ojo al lienzo una vez han pasado todos los vértices (y polígonos) por la MATRIZ DE PROYECCIÓN.

 

El rayo imaginario es disparado de manera diferente en cada técnica de RASTERIZACIÓN 3D. Sin embargo, es común encontrar que el sentido es un tanto distinto a la lectura de textos o de los rayos catódicos en una CRT, el rayo al llegar a la ultima linea no retorna por el contrario regresa en sentido contrario.

Como entenderán es llamado “rasterización” al ser el proceso de convertir los polígonos a un espacio “raster”. Es decir,  llevarlos a una matriz de puntos en una memoria.

Esto es lo que conocemos como RASTERIZACIÓN y si recuerdan el FROSTUM ponderando los valores de lienzo y el plano más lejano son almacenados en un espacio de memoria llamado Z-BUFFER.

Fuente de la imagen: Foros de  NeoGaf

z'= 2 \cdot \frac{{z} - \mathit{near}}{\mathit{far}-\mathit{near}} - 1

F.Wikipedia

Un tema final de la RASTERIZACIÓN y es la locura de los fragmentos. No es distinto al sombreado Phong. Cuando lanzamos el rayo desde la cámara al triangulo (polígono)   es dividido en pequeños fragmentos (discretos o enteros), pero la información como entenderán calculamos (interpolamos) desde la posición relativa a cada uno de los vértices.

Fragments for a triangle are colored in yellow

Fuente de la imagen: https://developer.tizen.org/

Escribir en detalle acerca de los algoritmos para RASTERIZACIÓN 3D es algo de nunca acabar, por favor visitar:

PINTURAS RUPESTRES COMPUTACIONALES O TEXTURAS..ULTIMA ESTACIÓN

Los objetos reales tienen superficies que podemos simular mediante diminutas  fotografías que llamaremos TEXTURAS. Las texturas realmente son pequeños espacios de memoria y almacenan en la GPU como un recurso gráfico.  Una imagen es definida en coordenadas de PIXELES (x,y) mientras que la TEXTURA utiliza un nuevo sistema de coordenadas de memora mientras , los   TEXELES (u,v) relacionadas a su posición relativa al interior de un conjunto de polígonos.  Es claro que a las texturas les aplicamos las matrices de proyección y de transformación al ser parte de un modelo 3D.

TEXTURA 3D BASICO PARA NO INGENIEROS NI MATEMATICOS
Fuente de la imagen: https://people.cs.clemson.edu/

Como es costumbre lanzamos un rayo desde la cámara que golpea el modelo, con esta técnica podemos recuperar las coordenadas TEXEL(u,v)  del color de TEXTURA (x,y),  upara proporcionar el color del píxel al polígono.

Aun cuando originalmente la aplicación de texturas eran limitados a cubos, cilindros y esferas (ecuaciones paramétricas),  con el texturizado  que conocemos o  “mapeado de textura UV unwrapping” con una sola imagen es posible aplicar una sola textura a un conjunto de polígonos .

Resultado de imagen para uv unwrapping
Fuente de la imagen: https://blenderartists.org/forum/

Existen otros temas interesantes.  Cando dibujamos  las  figuras en los polígonos tienden a traer varios inconvenientes:

  • La tendencia “pixelearse”, nos obliga a calcular o interpolar el color desde los píxeles contiguos
  • Saltar de su sitio por fallos en los cálculos de la perspectiva y deben ser corregidos.

Fuente de la imagen: http://www.tomshardware.com/reviews/ati,819-4.html

En cuanto a los algoritmos para reducir el pixelado realmente son interpolaciones de colores de allí nacen términos Bilineal , Trilineal y Anisotropico.

Anisotropic filtering: es un método para mejorar la calidad de una textura en una superficie que está vista desde un ángulo oblicuo con respecto al ángulo de proyección de la textura sobre una superficie. Wikipedia.

Visitar:

Resumamos un poco sobre como pintar los polígonos:

Los vértices ingresan a un proceso consecutivo de transformaciones, pero  en  este punto deseamos colorearlos.

  • Una opción es usar un SHADER o una aproximación a un problema de iluminación. Como ejemplos clásicos el Phong y el Gouraud, con los cuales podemos realizar un degradado de  colores en un conjunto de vértices para simular la incidencia de la luz.
  • Igualmente, podemos usar una imagen que rellene el triangulo que le llamamos TEXTURA, para ello definimos unas nuevas coordenadas (u,v) o TEXELES (u,v).  Las coordenadas  (u,v) la  debemos extraer disparando un rayo desde la cámara al objeto. En el punto donde la cámara impacte debemos ir a las coordenadas de TEXTURA (x,y) y extraer la información de color para ofrecerle en pantalla.
  • Es posible usar ambos  y combinarlos como comentaré en el siguiente apartado…
Fuente de la imagen: Image synthesis and OpenGL: graphics pipeline

Si son observadores, habrán notado que con el uso de mallas de polígonos (wireframe) veremos todos incluso lo que está detrás de las caras y objetos que ubicamos detrás de otros polígonos (u objetos). Lo podemos resolver mediante muchas opciones, pero solo describí las 2 principales:

  • FACE CULLING, usando algo llamado vector normal o perpendicular a la superficie del lienzo y polígono podemos calcular el ángulo entre ellos, determinando si son o no visibles.
  • 3D RASTER. de la misma manera podemos disparar un rayo desde la cámara una vez hemos transformado todo al espacio de cámara (perspectiva) para verificar que objetos son golpeados por el rayo. Si almacenamos  en el z-buffering el valor ponderado  de la distancia del rayo que impacta el polígono con ayuda de la distancia entre el lienzo y el plano más alejado de la cámara podemos determinar que objetos son visibles y en qué orden.  Dado que  solo bastará con tomar los puntos de menor valor almacenados en el z-buffer. Gracias al rasterizado 3D podremos pintarlos correctamente con un SHADER o la TEXTURA.

 

REGRESANDO A LA ILUMINACIÓN EN TIEMPO REAL …NOTAS ANEXAS…

Tanto que hablo de términos locos, brujerías extrañas, pero nada que comento sobre la iluminación. Bien, pues la iluminación en 3D en tiempo real es lo más cercano que conozco a un ser mitológico y utópico.  Si recuerdan lo que comenté líneas atrás los SOMBREADORES primitivos  son  realmente  SOMBREADORES SOBRE LOS VÉRTICES (VERTEX SHADING), trabajan sobre la información de los  vértices para calcular el color el interior del polígono y así simular la iluminación.

Fuente de la imagen https://takinginitiative.wordpress.com

El gran salto en la mejoría del esquema 3D lo encontramos en la mezcla de regiones  de memoria  (BLENDING  o mezclado bit a bit de los colores).

Todo lo que conocemos parte del los mapas de luces (LIGHT MAP), tomando toda la escena 3D  y en un programa a parte calculamos toda la iluminación fija  como una textura (mediante otros algoritmos no descritos). Posteriormente se da una mezcla de colores en tiempo real de la  información con esta textura (tostada) con el modelo sombreado/textura, con lo que obtendremos un buen resultado en tiempo real. No es muy distinto de los mapas modernos de sombras en tiempo real generados con las técnicas de oclusión (OCLUSIÓN MAPS)

Ejemplo de Light map, a la derecha la escena compuesta y a la izquierda la textura que son el resultado del pre-tostado con un software en etapa de diseño.

Visitar:

AHORA SI!! LA CORTA, PERO SOBREVALORADA HISTORIA DE LA FACTORÍA  3D…LA GPU

Si lograron entender medianamente este largo texto, requerimos un procesador dedicado con una memoria dedicada, con capacidad para la matemática de coma flotante, de paso reduzca el número de pasos en las operaciones entre matrices y que ademas nos ofrezca uno que otro sombreador simple con el uso de texturas y otro largo etcétera de técnicas.

 

3D PARA NO PROGRAMADORES GPU.png
Fuente de la imagen: Programmable graphics pipeline Adapted from Suresh Venkatasubramanian UPenn

Lo que llamamos la GPU (Graphics Processor Unit) es  la fábrica dedicada al proceso industrial de los vértices,  podremos comprender mejor desde un proceso fijo o llamado FIXED PIPELINE que contiene muchas de las soluciones que he comentado en esta entrada.  Entiendo que es lo más cercano a una herejía, pero a mi parecer es muy importante para entender de qué trata una GPU desde la base.

Existen muchas interpretaciones al FIXED PIPELINE. Pero, en este nivel de reducción es como una receta de cocina bien ejecutada. Bien puede invocar o realizar de manera arbitraria las llamadas a la GPU, multiplicar las matrices en cualquier orden. Pero, solo un camino nos llevara a completar la receta. 

ULTIMA PARADA PARA LOS SOMBREADORES PERSONALIZADOS..

No paso mucho tiempo antes que  a la  GPU  le devolviéramos una pequeña cantidad de flexibilidad en especial para correr procesos sobre los vértices, mediante micro-programas (VERTEX SHADERS)  útiles para el caso de la iluminación, los efectos de agua y en general para la animación de las figuras. Al mismo tiempo se pensó en el por qué no hacer lo mismo con las TEXTURAS generar micro programas y ayuden a modificarles haciendo que la GPU le encargamos el trabajo de “rasterizado” o  PIXEL SHADER.

Fuente de la imagen https://users.soe.ucsc.edu/.

Estas unidades estaban separadas al principio y corrían pequeños micro-programas en sus unidades o súper ALU independientes. No son cualquier ALU como las de la CPU, son especializadas en operaciones entre matrices. A esta brujería fue llamada PROGRAMMABLE PIPELINE o el uso de unidades independientes que procesan tanto la información de los vértices como las de los pixeles.

3d para todos gpu cpu.png
Fuente de la imagen: Performance of Parallel Processing on Processing Units Oscar Inzunza-Monreal

Las GPU modernas contienen en ellas un  conjunto de unidades  ALU  unificadas para realizar el procesamiento 3D es decir matrices. Si recuerda comente que los sombreadores simulan los efectos de la luz al chocar con los materiales, su proliferación se ha favorecido con las nuevas GPU.

Visitar

FINAL ..FINAL NO VA MAS…DILEMA DE LA GPU..

Por último deseo resumir el lió mercantil moderno o paradoja de  vender un mayor procesamiento. Como primicia recuerden que todo los que describí anteriormente o  proceso de renderizado (RENDER) requiere mucha memoria  RAM y deben realizarse de manera que produzca cada uno de los fotogramas o escena al menos a taza de 24 fotogramas por segundo (24 fps estándar en el cine comercial),  que de por sí ya requiere una buena cantidad de respuesta en  MHZ en memoria y de la GPU .

Por un lado todavía usamos este antiguo esquema  VERTICE/POLIGONAL, nos ha obligado a usar cada vez un mayor número de triángulos y como respuesta hemos integrado varios tipos de poderosos algoritmos para interpolar la imagen de pantalla en tiempo real para  suavizar la salida  (ANTIALIASING) del RENDER en pantalla.

Fuente de la imagen:Role of Anti-Aliasing (AA) in Gaming en  https://ageeky.com/

Seguimos con la triste historia de la  RAM  y su costo (velocidad y precio), muchas de las GPU que conocemos resuelven  aquellos problemas de trabajar mega pixeles requeridos en pantalla al optar por  realizar el proceso en pequeños cuadros (tiles) …agregando más y más  MHZ de la GPU etc.

Fuente de la imagen:  On nvidia tile based rendering

 

3D PARA TODOS ATRAPADOS EN LOS VERTICES.jpg
The Thirteenth Floor, conocida en español como El piso 13 o Nivel 13,  película de ciencia ficción de 1999 dirigida por Josef Rusnak e inspirada en la novela Simulacron-3 (1964) de Daniel F. Galouye

..con esto daré por terminada esta larga entrada,  y como entenderán, no parece que nos lleve a un nuevo lugar o un nuevo paradigma  y al parecer viviremos (padeceremos) en este esquema durante  otro largo tiempo. Tiempo en el que seguiremos viviendo con esta solución de la fábrica de transformaciones de vértices, así como lo hemos hecho desde hace 40 años. 😉

 

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s