Generacion de una imagen 3D
-
Voy a intentar explicar como se genera una imagen 3D con el ordenador; es decir como un juego utiliza los recursos de nuestro PC para generar las escenas que son visualizadas en el monitor.
Hace ya mucho tiempo que aparecieron las GPU (Unidad de Procesamiento Gráfico), en un primer momento se habló de que eran totalmente independientes del procesador y que este no influiría en el rendimiento de nuestra tarjeta. Esto tiene su parte de verdad y de mentira, me explico. Si es cierto que la GPU es la encargada de generar la escena o imagen sin necesidad de la intervención del procesador, pero la CPU realiza una labor fundamental y que determinará la cantidad de imágenes resultantes. Este proceso no es mas que el de suministrar los datos sobre los que trabajará nuestra GPU. Podemos apreciar que si nuestra CPU es lenta y no es capaz de suministrar la cantidad de datos que necesita nuestra GPU el rendimiento se verá afectado en gran medida; por lo que podemos llegar a la conclusión de que la CPU SI influye en el rendimiento.
Después de esta aclaración (a mi en su momento me resulto chocante la afirmación “independiente de la CPU”) voy a describir los pasos o etapas que se realizan hasta llegar al resultado final.
Podemos distinguir 4 etapas o pasos:
-
“Operaciones sobre vértices”. Esta etapa recibe a trabes del bus (AGP o PCI-E) una lista de vértices sobre los que realizará agrupaciones (normalmente formando triángulos), transformaciones (rotación, translación), etc…
-
“Delimitación de elementos en la escena”. Recibirá el resultado de la etapa anterior y delimitará el espacio 2D visible en la pantalla (clipping ) y la cara visible de cada polígono (culling). Con el clipping evitaremos procesar aquellos polígonos que se salgan de nuestra área de trabajo y con el culling procesaremos solo aquella cara del polígono que será visible. Imaginaros que queremos mostrar una esfera, es absurdo procesar hasta la ultima etapa la cara que no se ve.
-
“Conversión de vértices en píxeles”. En esta etapa también conocida como rasterizer se convierte cada punto, línea o polígono en una matriz de puntos donde se guarda información acerca del color y profundidad. Anteriormente a la serie 6 de nVidia y la serie 1000 de ATI, el color se representaba como tres componentes RGB (rojo, verde y azul) de 8 bits cada uno; mas el canal Alfa que determina el grado de opacidad del objeto. Con la implementación del formato HDR (High Dynamic Range) se utilizan números en punto flotante de 16 bits por canal, por lo que la precisión es mucho mayor y la representación del color es mucho más real.
Como resultado de esta etapa, la lista de vértices que proporcionaba la CPU se ha convertido en una matriz cuyas dimensiones son las del frame buffer (área de memoria de video que guarda información que se mostrará en nuestro monitor). En esta etapa influirá da manera drástica la resolución de pantalla que utilicemos, pues dependiendo de ella tendremos mas o menos píxeles. -
“Operaciones sobre píxeles”. Esta etapa realizará multitud de funciones sobre los píxeles, normalmente cuanto mayor sea la versión del verter shader mayor será la funcionalidad y por tanto podremos hacer más cosas.
Trabajará sobre el frame buffer cuyo contenido se mostrará directamente en pantalla.
Las funciones principales de esta etapa son la aplicación de texturas en la que a cada polígono le pegará la textura que le dará su aspecto externo, y el mezclado de elementos que realizará la composición de la escena indicando si los nuevos elementos superponen a los existentes, etc.
Estas funciones son tremendamente complejas ya que por ejemplo las texturas deberán transformarse dependiendo del ángulo, posición, etc del polígono sobre el que se aplicaran.
En este punto debemos tener claro la diferencia entre píxel y téxel. El primero son los puntos que forman las imágenes mientras que el segundo define la textura de un objeto 3D. El píxel vendrá determinado por la resolución de pantalla (mas o menos cantidad) pero el téxel no ya que esta vinculado a la GPU y no al monitor como ocurre con el píxel.
Las etapas que operan sobre píxeles son mucho mas complejas que las que operan sobre vértices ya que a partir de un numero mas o menos pequeño de vértices se pueden generar millones de píxeles, es por esto que el numero de etapas o cauces dedicados a los píxeles es mucho mayor que el de vértices (en la Geforce 7800 hay 24 etapas o unidades de procesamiento de píxeles por tan solo 8 unidades para el procesamiento de vértices)
Espero que os haya quedado más claro como llegamos hasta una escena de un determinado juego.
-
-
:eoh: :eoh: :eoh: :llorar: :llorar: …............y yo que creia que esta mini guia os iba a gustar mucho.
Nadie tiene algo que opinar acerca de como funcionan una GPU???? Algun comentario, critica, ............
Es que estas cosas son demasiadas triviales y por eso no las consideraias interesantes???? :vayatela: :vayatela: :vayatela: -
No son triviales, ni muchísimo menos. Lo que pasa es que seamos sinceros, a ti, y a un par de foreros más nos pueden parecer interesantes, pero para la mayoría de la gente lo único importante es si la 6600GT más rápida es la XFX o la ASUS y si la 6800LE muta o no. A poca gente le importa lo que ocurre por debajo.
-
Además está bien, que nadie comente nada no quiere decir que no sea interesante.
Un saludo.
-
Quizas tengas razon kynes, pero creo que se deberia de empezr a hablar un poco mas de cosas mas interesantes y no ver siempre las mismas preguntas. En ocasiones veo en muchas ramas preguntas repetidas o casi iguales que fueron respondidas, pero que la gente las sigue preguntando…...
Se que a mucha gente solo le importa que targeta es mejor o peor, pero nunca esta de mas aprender ciertas cosas. No es por echarme flores ni mucho menos, pero en muy poquitos libros he visto explicado el proceso de generacin tan facil como creo que lo he expuesto. Este foro tiene cosas muy buenas, y gente que sabe mucho de ciertos temas; intentemos entre todos compartir lo que sabemos que seguro que nos será mucho mas ameno e interesante.Por cierto, gracias a los dos.
-
Yo soi un noob en eso, i me kedao mas o menos iwalito k kuando empece a leer :P. algo e pillao, lo mas basiko, pero kreo k ya tendre tiempo para aprenderlo bien jeje. pienso k es un punto fuerte para akellos k se interesen en crear motores de juegos i eso, o simplemente para elegir un buen modelo de targeta grafika. ;).
-
- “Conversión de vértices en píxeles”….Anteriormente a la serie 6 de nVidia y la serie 1000 de ATI, el color se representaba como tres componentes RGB ..
Me ha picado la curiosidad… das a entender que las nuevas gráficas ya no funcionan de la forma que explicas, entonces, ¿Como funcionan?
Saludos
-
Antes de la serie 6 de nVidia y las X1000 de ATI, el color que tenia un determinado píxel se representaba por tres componentes que representaban los colores Rojo, Verde (G) y Azul (B); cada uno de ellos era un entero de 8 bits de precision. Los ingenieros se dieron cuenta que esta no era la manera mas idonea de representar el color pues no se corresponde a la interpretacion que hace el ojo humano. Empezaron a utilizar un formato que provenia de la industria del cine, el HDR. Con este nuevo formato se utilizan numeros de punto flotante de 16 bits. Conseguimos tener mas precision y representar de manera mas fidedigna y real el color, ademas de responder como hace el ojo humano.
Date cuenta que el ojo humano tiende a oscurecer las imagenes muy claras (se cierra la pupila para que entre menos luz), y a aclarar las imagenes muy oscuras (se abre la pupila para permitir meyor paso luz). Esto se puede representar mucho mejor con numeros en punto plotante que con enteros, los primeros tienen un rango mucho mas grande y podemos jugar con el exponente para tener mas precision. -
A mi no me digas nada que me acabo de incorporar y lo acabo de ver
Es muy interesante :sisi: -
Ojalá hubiese mas posts como este en el foro, ya apenas respondo (no se si os habreis dado cuenta) pq las preguntas repetidas mas de cuatro veces me sacan de quicio… enhorabuena por el post Sergiman
-
Antes de la serie 6 de nVidia y las X1000 de ATI, el color que tenia un determinado píxel se representaba por tres componentes que representaban los colores Rojo, Verde (G) y Azul (B); cada uno de ellos era un entero de 8 bits de precision. Los ingenieros se dieron cuenta que esta no era la manera mas idonea de representar el color pues no se corresponde a la interpretacion que hace el ojo humano. Empezaron a utilizar un formato que provenia de la industria del cine, el HDR. Con este nuevo formato se utilizan numeros de punto flotante de 16 bits. Conseguimos tener mas precision y representar de manera mas fidedigna y real el color, ademas de responder como hace el ojo humano.
Date cuenta que el ojo humano tiende a oscurecer las imagenes muy claras (se cierra la pupila para que entre menos luz), y a aclarar las imagenes muy oscuras (se abre la pupila para permitir meyor paso luz). Esto se puede representar mucho mejor con numeros en punto plotante que con enteros, los primeros tienen un rango mucho mas grande y podemos jugar con el exponente para tener mas precision.Un par de anotaciones. El HDR no depende del formato que se utiliza. Puedes tener HDR con enteros (p.ej. con el formato 10-10-10-2, o el 16-16-16-16 que utiliza 64 bits para cada pixel) o con punto flotante como el HDR FP16 (un ejemplo es el OpenEXR) El HDR simplemente es extender el rango desde el LDR (8-8-8-8 que son los 32 bits de color normales) para permitir mayores transiciones de color.
El efecto de emulación del comportamiento del ojo humano no es obligatorio para el HDR, pero es uno de los efectos que mejor quedan al aplicar una extensión del rango.
-
HDR con numeros enteros????? No sabia de su existencia.
La mejora que aporta el HDR es pasar de los 32 bits que comentas a 48 bits, pero en punto flotante para tener mayor rango de representacion y realismo.Gracias Forenaits, haber si conseguimos entre todos hablar de cosas un poco mas interesantes.
-
Se está llamando HDR a cualquier aumento de el número posible de colores desde los famosos 16 millones. El formato 10-10-10-2 utiliza seis bits del canal alfa que los reparte entre los otros tres canales para aumentar el rango a 1073 millones, el 16-16-16-16 (serían 64 bits de color) aumenta a 281 billones… La verdad es que un formato en coma flotante siempre es mejor que utilizar enteros, pero tiene una carga computacional muy superior trabajar en flotantes que trabajar en enteros, además de que el FP16 utiliza 8 bytes para cada pixel. Este formato requiere una componente fp16 por cada canal, por lo que tendríamos el doble de consumo de ancho de banda que en un formato RGB 24 (32) clásico, con la consiguiente reducción de rendimiento por este motivo. Un compromiso entre calidad y rendimiento sería el formato que usa Xenos, el chip gráfico de la XBox360, que es un fp 10-10-10-2. Lo malo es que ningún chip para pc's lo implementa para el render target, todavía.
-
El HDR que yo menciono es el proviniente de OpenEXR. Se utilizan 48 bits por pixel frente a otros formatos (por ejemplo LBNL utiliza 32). Tambien he de decir que no es que sea el mejor formato ya que por ejemplo LBNL tiene un rango de entre 10 elevado a -38 y 10 elevado a 38; muy superior al HDR de OpenEXR.
Por cierto, ahora que lo mencionas ¿cuantos bits se utilizan en HDR para el canal Alfa???
Con respecto a la carga computacional, es indudable que operar con una representacion de punto flotante es mucho mas compleja; pero la arquitectura de la GPU tiene muchas cosas buenas. Una de ellas es un bus de 256 bits frente a los 64 de la CPU. Ademas no creo que la potencia sea un problema para la GPU, com mas de 100 GFLOPS puede permitirse trabajar con aritmnetica en punto flotante.
-
Depende, hay formatos que utilizan solo dos, como el fp 10-10-10-2 de xenos, hay formatos que utilizan 16, como el OpenEXR… Hay mucha gente que asocia HDR con OpenEXR, ya que este formato es el que utilizan las gamas 6 y 7 de nVidia para su HDR fp16, pero es únicamente una forma de hacerlo. En verdad OpenEXR tiene como opciones 64 bits por pixel y 48 bits por pixel para fp16, y 128 bits por pixel o 96 bits por pixel para fp32 o int32.
Hay una cosa que está clara, si tiene mayor rango en el exponente, estás utilizando bits que deberían ir a la mantisa, por lo que la resolución será mucho menor. No se yo que solución es mejor, la verdad. Yo creo que siempre es mejor tener menor rango exponencial, pero tener mucha mayor resolución.
Con respecto a la carga computacional, es indudable que operar con una representacion de punto flotante es mucho mas compleja; pero la arquitectura de la GPU tiene muchas cosas buenas. Una de ellas es un bus de 256 bits frente a los 64 de la CPU. Ademas no creo que la potencia sea un problema para la GPU, com mas de 100 GFLOPS puede permitirse trabajar con aritmnetica en punto flotante.
Perdón, saqué algo a la conversación que no es correcto, ya que internamente las tarjetas ya trabajan con una precisión FP32 (nVidia FX, 6 y 7, y ATI X1) o FP24 (ATI pre X1), lo que varía es la precisión del render target. Es más una cuestión de ancho de banda que otra cosa.
-
Me acabo de acordar de una cosa que tal vez os parezca interesante:
Un prefesor de mi facultad hizo unas pruebas de rendimiento para comparar la arquitectura de una CPU actual frente a la arquitectura de una GPU. Ejecuto un codigo que definia una malla irregular de nodos y aristas de conectividad media (no me pregunteis que es poruqe no lo se) definida por un codigo de Euler. Los datos que obtuvo es que el tiempo que empleo un PIV a 3.2 era 32.447 milisegundos y una 6800 tardo 12.128 milisegundos.
Esto no quiere decir que la GPU sea mejor que la CPU, sino que en ciertas condiciones tiene mucha mayor potenca. Con este caso de la malla de Euler pretendia anular la mejor baza que tiene las CPU actuales: la cache. No olvidemos que la GPU no tiene cache (tiene, pero muy muy pequeña); pero tiene un bus 8 veces mas grande con lo que se consigue no solo suplir la falta de cache sino que obtiene mayor rendimiento. -
Quizás te interesen estos hilos de Beyond3D sobre GPGPUs (general purpose GPUs, o utilizar las GPUs para más cosas a parte de para gráficos como para folding at home)
-
Ejecuto un codigo que definia una malla irregular de nodos y aristas de conectividad media (no me pregunteis que es poruqe no lo se) definida por un codigo de Euler.
Creo que se refiere a configuraciones intermedias entre estrellas y anillos, con cierta redundancia para evitar aislamientos en el caso de que se caiga una línea. Es un tipo de configuración muy típica en telecomunicaciones, no es tan cara como la estrella y es mucho más fiable que los árboles puros o los anillos.
-
Lo de la malla de Euler no se que es, pero hizo esto porque el algoritmo que definio hacia multiples saltos que anulaban por completo la cache del procesador (para luchar en igualdad de condiciones ).
Los enlaces que me has dado los leere mas adelante, ahora estoy un poco liado y mi nivel de ingles no es que sea como para tirar cohetes. De todas formas gracias.
-
Hacia tiempo que no disfrutaba tanto leyendo una rama, gracias a los dos Sois unas máquinas