Nicolás Wolovick, 20160510
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.
The blitter made the Amiga popular with enthusiast demo scene programmers. Compared to the MC68000 processor (also found in rival computers of the time) the blitter needed no memory cycles for fetching instructions, no silicon for decoding, and contained a barrel shifter to assist shifting pixel-accurate graphics in bitplanes. It also performed a "4 operand" boolean operation (typically destination:=op(destination, source, mask))
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, 60≤fps).
¿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 profundad de colores de 24bit. Tenemos 16.6ms para transformar, iluminar, cortar, proyectar, pegar texturas y generar los píxeles de:
Historical Polycounts, 2011.
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 }
Cg
Cg
es un lenguaje de programación de NVIDIA & Microsoft para shaders.
(está en desuso, hay que mirar GLSL
)
Veamos dos ejemplos de OpenGL Examples
Pequeños programitas que actúan de manera independiente en todos los vértices o fragmentos del pipeline gráfico.
(wink)
Operado por los ROPs.
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.
6 vertex shader processors, 16 fragment shader processors, 40 GFLOPS pico.
fp32
.No me interesan: sombras condicionales, mapas de desplazamientos, etc. Yo quiero: GPU particle systems, GPU navier-stokes, etc.
(Mark Harris, Mapping Computational Concepts to GPUs, ACM SIGGRAPH 2005.)
(Ashu Rege, Shader Model 3.0, NVIDIA, 2004.)
(J. Owens, et.al, A Survey of General-Purpose Computation on Graphics Hardware, Computer Graphics Forum, 26(1), 2007)
¿Como es un programa en GLSL?
1 varying vec3 N;
2 varying vec3 v;
3 void main(void)
4 {
5 v = vec3(gl_ModelViewMatrix * gl_Vertex);
6 N = normalize(gl_NormalMatrix * gl_Normal);
7 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
8 }
(Clockworkcoders Tutorials, Per Fragment Lightning.)
1 varying vec3 N;
2 varying vec3 v;
3 void main (void)
4 {
5 vec3 L = normalize(gl_LightSource[0].position.xyz - v);
6 vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0)
7 vec3 R = normalize(-reflect(L,N));
8
9 //calculate Ambient Term:
10 vec4 Iamb = gl_FrontLightProduct[0].ambient;
11
12 //calculate Diffuse Term:
13 vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);
14 Idiff = clamp(Idiff, 0.0, 1.0);
15
16 // calculate Specular Term:
17 vec4 Ispec = gl_FrontLightProduct[0].specular
18 * pow(max(dot(R,E),0.0),0.3*gl_FrontMaterial.shininess);
19 Ispec = clamp(Ispec, 0.0, 1.0);
20
21 // write Total Color:
22 gl_FragColor = gl_FrontLightModelProduct.sceneColor + Iamb + Idiff + Ispec;
23 }
(Clockworkcoders Tutorials, Per Fragment Lightning.)
DirectX 10, incorpora geometry shaders (quitar o agregar vértices), luego del vertex shader.
NVIDIA, en vez de agregar más unidades específicas, cambia la arquitectura.
load
& store
.
(NVIDIA, NVIDIA GeForce 8800 GPU Architecture Overview, 2006.)
(NVIDIA, NVIDIA GeForce 8800 GPU Architecture Overview, 2006.)
(NVIDIA, NVIDIA GeForce 8800 GPU Architecture Overview, 2006.)
(Mike Houston, Beyond Programmable Shading Retrospective, AMD, SIGGRAPH 2009.)
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |