Nicolás Wolovick, $Date: 2012-05-22 20:57:01 -0300 (Tue, 22 May 2012) $, $Revision: 3536 $
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.
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 GFLOP 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.)
Cualquier dispositivo móvil de rango medio-alto incorpora algún acelerador 3D.
Todos soportan GLESv2.
Básicamente: programables, bajo consumo, gran paralelismo.
(Varun Sampath, Mobile GPUs, UPenn, CIS565, 2011)
¡Un par de estos chips ya son OpenCL-capable!
(Anandtech, NVIDIA's Tegra 3 Launched: Architecture Revealed, Sep 2011.)
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.)
fp32
y fp64
.fp32
.(NVIDIA’s Next Generation CUDA Compute Architecture: Fermi™, NVIDIA, 2009.)
opcode.type d, a, b, c;
(Hennessy, Patterson, CAAQA5, p.298)
(Hennessy, Patterson, CAAQA5, Fig-4.17)
(Hennessy, Patterson, CAAQA5, Fig-4.17)
(Hennessy, Patterson, CAAQA5, Fig-4.17)
A demostration of the value of the PTX is that the Fermi architecture radically changed the hardware instruction set -- from being memory-oriented like x86 to being register-oriented like MIPS as well as doubling the address size to 64 bits -- without disrupting the NVIDIA software stack.
(Hennessy, Patterson, CAAQA5, p.330)
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 |