Nicolás Wolovick, 20140515
Probar también Valley Benchmark de Unigine para ver una escena realmente compleja con >=1 MTris y efectos gráficos que solo logran 60 fps en una GPU de alta gama.
Ok, las GPUs computan muchísimos números de punto flotante, pero ...
¿De donde salen?
GPUs and CPUs do not go back in computer architecture genealogy to a common ancestor; there is no Missing Link that explains both..
(Hennessy, Patterson, CAAQA5, p.288)
Rutina de Bit Block Transfer, Xerox Alto, 1973.
Opera en un "rectángulo" de la memoria, operando
Destination, boolean function, Source, Texture.
Usualmente la función se conocía como ROP Raster OPeration.
A mediados de los 80s aparecen las Commodode Amiga con BITBLT
implementado en hardware.
Atari ST rápidamente copia el blitter.
La placa VGA original no incorporaba blitter. Pero por ejemplo en 1993 la CL-GD5426 incorpora un blitter.
(Rob Pike, Leo Guibas and Dan Ingalls, SIGGRAPH'84 Course Notes: Bitmap Graphics , AT&T Bell Laboratories 1984.)
Usar el BITBLT de las placas para efectuar operaciones booleanas sobre memoria muy rápidamente.
Este tipo de ideas se mantiene a lo largo de todo el recorrido de hardware-assisted graphics.
Los gráficos de commodity computers pasaron de 2D en los 80s a 3D en los 2000.
Veamos como funciona un graphic pipeline típico para 3D real-time rendering (juegos, fps>=60).
¿Cómo cada uno de los triángulos contribuye a la imagen final?
(CMU 15-869, Graphics and Imaging Architectures)
Queremos 60 fps en 1920x1080 con colores de 24bit. Tenemos 16.6ms para transformar, iluminar, cortar, proyectar, pegar texturas y generar los píxeles de:
(Rick Stirling, Yes, but how many polygons?, 2007)
Sería bueno poder calcular esto un poco mejor.
Un vertex
es una tupla con attributes
.
Cada attribute
tiene components
.
1 struct vertex {
2 float3 pos; // screen pixel coordinates (sample point location)
3 float3 normal;
4 float2 texcoord;
5 }
Como un MPI_GatherV
,
pero de información 3D.
Función que procesa cada vértice.
Mapeo de todo el arreglo de vértices por una función.
También conocido como T&L —transform and lightning—.
Aplica una matriz de 4x4 que es composición de cuatro matrices:
(Wikibooks, GLSL Programming, Vertex Transformations.)
A partir de:
Se calcula la intensidad de luz que recibe el vértice.
Transformaciones que modifican (ligeramente) la posición de los vértices.
Texturas pueden ser mapas de altura para desplazamientos de vértices.
(Simon Green GeForce 6 Series OpenGL Extensions, 2004?)
(Wikibooks, GLSL Programming, Rasterization.)
(GLSL Tutorial von Lighthouse3D.)
¿Convierte los vértices o también todos los puntos intermedios?
Asigna color y textura a cada fragmento o pre-pixel.
(Wikipedia, Phong reflection model.)
Sumas, productos punto, potencias fraccionarias, multiplicación por constantes.
Un fragment shader puede ser computacionalmente intensivo.
1 float diffuse = max(dot(N, L), 0.0);
2 float specular = max(pow(dot(H, N), u_shininess), 0.0);
1 struct fragment {
2 float x,y; // screen pixel coordinates (sample point location)
3 float z; // depth of triangle at sample point
4 float3 normal;
5 float2 texcoord;
6 // interpolated application-defined attribs
7 // (e.g., texture coordinates, surface normal)
8 }
Después de procesar
1 struct output_fragment {
2 int x,y; // pixel
3 float z;
4 float4 color;
5 }
1 if (fragment.z < zbuffer[fragment.x][fragment.y]) {
2 zbuffer[fragment.x][fragment.y] = fragment.z;
3 colorbuffer[fragment.x][fragment.y] =
4 blend(colorbuffer[fragment.x][fragment.y], fragment.color);
5 }
Además del depth test hay otros: alpha test, stencil test, etc.
(CMU 15-869, Graphics and Imaging Architectures)
Uniforms: funciones aridad 0 (constantes).
Textures: funciones aridad 2.
Pre-GPU: Wolfenstein 3D (1992), Doom (1993).
Código de CPU optimizado artesanalmente.
Michael Abrash, Graphics Programming Black Book, 1997.