Scalable Tissue Imaging and Modeling (STIM) Laboratory
Department of Electrical and Computer Engineering
Cullen College of Engineering
University of Houston
David Mayerich
STIM Laboratory, University of Houston
polygon: a series of line segments forming a closed planar shape
vertex: a point joining two line segments
transform: 2D or 3D linear operation applied to a series of vertices
David Mayerich
STIM Laboratory, University of Houston
David Mayerich
STIM Laboratory, University of Houston
David Mayerich
STIM Laboratory, University of Houston
orthographic projection: directly eliminate the z-axis component after rotating to the camera
perspective projection: scale the \((x,y)\) coordinates as a function of \(z\) (distance from the camera)
points must be represented as a 4D vector
David Mayerich
STIM Laboratory, University of Houston
// calculate view (V) and projection (P)
// allocate endpoints for lines
point p[2];
// for every polygon in the scene
for(int pi = 0; pi < P; pi++) {
// for every vertex in the polygon
for(int vi = 0; vi < Polys[pi].V; vi++) {
// calculate the screen point
vertex p[1] = P * V * Polys[pi][vi];
// if this is not the first poly point
if(vi != 0)
// draw a line between the points
drawLine(p[0], p[1]);
// shift points to draw the next line
p[0] = p[1];
}
// connect the polygon
drawLine(p[0], Polys[pi][0]);
}Star Wars (Atari 1983), arcade-museum.com
most of the work:
\(O(P \times V)\)
all \(P\) polygons
all \(V\) vertices
Calculate a color value \(c=[c_r\, c_g\, c_b]\) for each point inside the polygon
Scan-line algorithm to fill pixels
Calculate illumination:
\(\mathbf{n}\) is the surface normal
\(\mathbf{l}\) is the direction to the light source
David Mayerich
STIM Laboratory, University of Houston
David Mayerich
STIM Laboratory, University of Houston
// calculate view (V) and projection (P)
// stores vertices for the current triangle
vertex* t = new vertex[3];
// for every triangle
for(int ti = 0; ti < T; ti++) {
// transform to screen coordinates
t[0] = P * V * Mesh[ti][0];
t[1] = P * V * Mesh[ti][1];
t[2] = P * V * Mesh[ti][2];
// calculate the normal
vector n = normal(t[0], t[1], t[2]);
// initialize light intensity to zero
color l_sum = 0;
// for each light in the scene
for(int li=0; li<L; li++)
// add its intensity
l_sum += cos(n, Lights[li].p);
// calculate the final color
color c = Mesh[ti].color * l_sum;
// draw all pixels in the triangle
drawPixels(t, c);
}I, Robot (Atari 1983), arcade-museum.com
all \(P\) pixels
all \(T\) triangles
all \(L\) lights
texture mapping: map a 2D image onto the polygons of a 3D object
David Mayerich
STIM Laboratory, University of Houston
provides additional color and shading details without extra vertices
Voodoo2, Quake (1996)
GeForce2 MX, Creature (2001)
GeForce2 Go, Toy Soldier (2002)
GeForce2 Ti, Grove (2000)
David Mayerich
STIM Laboratory, University of Houston
// calculate view (V) and projection (P)
// stores vertices for the current triangle
vertex* t = new vertex[3];
// for every triangle
for(int ti = 0; ti < T; ti++) {
// transform to screen coordinates
t[0] = P * V * Mesh[ti][0];
t[1] = P * V * Mesh[ti][1];
t[2] = P * V * Mesh[ti][2];
// calculate the normal
vector n = normal(t[0], t[1], t[2]);
// initialize light intensity to zero
color l_sum = 0;
// for each light in the scene
for(int li=0; li<L; li++)
// add its intensity
l_sum += cos(n, Lights[li].p);
// draw all pixels in the triangle
drawPixels(t, Mesh[ti].texture, l_sum);
}fragments
vertices
Darkened Skye, Boston Animation (2002)
David Mayerich
STIM Laboratory, University of Houston
1998
1999
2000
2001
2002
2003
2004
DirectX 6
Microsoft
multitexture
DirectX 7
Microsoft
DirectX 8
Microsoft
shader model 1.x
DirectX 9
Microsoft
shader model 2.0 - 3.0
OpenGL
Silicon Graphics
(1998) Ocarina of Time
(1999) System Shock
(2000) Baulder's Gate II
(2002) Warcraft III
(2004) Fable
Geforce 256
nVidia
hardware texture
and lighting
Geforce 2
nVidia
Geforce 3
nVidia
programmable shading
(XBox)
Cg
nVidia
shader language
Radeon 9700
Radeon
floating point math
GeForce FX
nVidia
practical GPGPU
GLSL
shading
language
Voodoo
3dfx Interactive
texture mapping
GeForce 3 - first programmable shader model (using assembly)
GeForce FX - first practical card for GPGPU
floating point precision
Cg provides a high-level language
for programming GPUs
David Mayerich
STIM Laboratory, University of Houston
Output varying(
float2 position: POSITION,
float4 color : COLOR,
float2 texCoord : TEXCOORD0) {
Output OUT;
OUT.position = float4(position, 0, 1);
OUT.color = color;
OUT.texCoord = texCoord;
return OUT;
}GeForce 3 Ti, Chameleon (2001)
GeForce FX 5200, Dawn (2003)
General purpose GPU programming mapped mathematical problems to rendering
Debugging was extremely difficult
You could get a PhD implementing reasonably complex algorithms using shading languages and rendering rectangles
Financial companies would hire game programmers to do market analysis
David Mayerich
STIM Laboratory, University of Houston
GeForce 8800 (2006)
Tesla architecture
first CUDA compatible card
CUDA 1.0 SDK (2007)
8800+ CUDA compatible
evolving compute capability (now 12.1)
Parallel model still based on GPUs
data parallel
single-instruction multiple data
(maps to shader programs)
David Mayerich
STIM Laboratory, University of Houston
GeForce 8800, Froggy (2006)
David Mayerich
STIM Laboratory, University of Houston
GeForce 200, Medusa (2008)
GeForce GTX 460, Heaven (2010)
GeForce GTX TITAN, Ira (2013)
GeForce GTX 900, Apollo Lunar Landing (2015)
CUDA Cores:
32-element SIMD vector units
hyperthreading
Tensor Cores:
optimized matrix multiply-and-accumulate (MMA)
mixed-precision arithmetic (ex. FP64, FP32, FP16, FP8)
Ray Tracing Cores:
bounding volume hierarchy (BVH) acceleration
optimized intersection detection
David Mayerich
STIM Laboratory, University of Houston
CUDA API
C/C++
CUDA Cores
Tensor Cores
Ray Tracing Cores
cuBLAS
cuDNN
OptiX
DirectX
Vulkan
Shading Language
David Mayerich
STIM Laboratory, University of Houston