Title: Where does the Vertex Engine fit?
1Where does the Vertex Engine fit?
Transform Lighting
Traditional Graphics Pipeline
setup rasterizer
texture blending
frame-buffer anti-aliasing
2GeForce 3 Vertex Engine
Vertex Program
Transform Lighting
setup rasterizer
texture blending
frame-buffer anti-aliasing
3API Support
- Designed to fit into OpenGL and D3D APIs
- Program mode vs. Fixed function mode
- Load and bind program
- Simple to add to old D3D and OpenGL programs
4Programming Model
- Enable vertex program
- glEnable(GL_VERTEX_PROGRAM_NV)
- Create vertex program object
- Bind vertex program object
- Execute vertex program object
5Create Vertex Program
- Programs (assembly) are defined inline as
- character strings
static const GLubyte vpgm \!!VP1. 0\ DP4
oHPOS.x, c0, v0 \ DP4
oHPOS.y, c1, v0 \ DP4
oHPOS.z, c2, v0 \ DP4
oHPOS.w, c3, v0 \ MOV
oCOL0,v3
\ END"
6Create Vertex Program (2)
- Load and bind vertex programs similar to texture
objects - glLoadProgramNV(GL_VERTEX_PROGRAM_NV, 7,
strelen(programString), programString) - .
- glBindProgramNV(GL_VERTEX_PROGRAM_NV, 7)
7Invoke Vertex Program
- The vertex program is invoked when a vertex is
given, i.e., when - glBegin()
- glVertex3f(x,y,z)
-
- glEnd()
8Lets look at a sample program
static const GLubyte vpgm \!!VP1. 0\ DP4
oHPOS.x, c0, v0 \ DP4
oHPOS.y, c1, v0 \ DP4
oHPOS.z, c2, v0 \ DP4
oHPOS.w, c3, v0 \ MOV
oCOL0,v3
\ END"
OHPOS M(c0,c1,c2,c3) v - HPOS? OCOL0
v3 - COL0? Calculate
the clip space point position and Assign the
vertex with v3 for its diffuse color
9Programming Model
V0 V15
Vertex Source
Program Constants
c0 c96
16x4 registers
OHPOS OCOL0 OCOL1 OFOGP OPSIZ OTEX0
OTEX7
Vertex Program
96x4 registers
R0 R11
Temporary Registers
128 instructions
12x4 registers
Vertex Output
15x4 registers
All quad floats
10Input Vertex Attributes
- V0 V15
- Aliased (tracked) with conventional per-vertex
attributes (Table 3) - Use glVertexAttribNV() to explicitly assign
values - Can also specify a scalar value to the vertex
attribute array - glVertexAttributesNV() - Can change values inside or outside
glBegin()/glEnd() pair
11Program Constants
- Can only change values outside glBegin()/glEnd()
pair - No automatic aliasing
- Can be used to track OpenGl matrices (modelview,
projection, texture, etc.) - Example
- glTrackMatrix(GL_VERTEX_PROGRAM_NV, 0,
GL_MODELVIEW_PROJECTION_NV, GL_IDENTIGY_NV) - Track 4 contiguous program constants starting
with c0
12Program Constants (contd)
- DP4 oHPOS.x, c0, vOPOS
- DP4 oHPOS.y, c1, vOPOS
- DP4 oHPOS.z, c2, vOPOS
- DP4 oHPOS.w, c3, vOPOS
- What does it do?
13Program Constants (contd)
- glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 4,
GL_MODEL_VIEW, GL_INVERSE_TRANPOSE_NV) - DP3 R0.x, C4, VNRML
- DP3 R0.y, C5, VNRML
- DP3 R0.z, C6, VNRML
- What doe it do?
14Hardware Block Diagram
Vertex In
Vertex Attribute Buffer (VAB)
Vector FP Core
Vertex Out
15Data Path
X
Y
Z
W
X
Y
Z
W
X
Y
Z
W
Swizzle
Swizzle
Swizzle
Negate
Negate
Negate
FPU Core
Write Mask
X
Y
Z
W
16Instruction Set The ops
- 17 instructions total
- MOV, MUL, ADD, MAD, DST
- DP3, DP4
- MIN, MAX, SLT, SGE
- RCP, RSQ, LOG, EXP, LIT
- ARL
17Instruction Set The Core Features
- Immediate access to sources
- Swizzle/negate on all sources
- Write mask on all destinations
- DP3,DP4 most common graphics ops
- Cross product is MULMAD with swizzling
- LIT instruction implements phong lighting
18Dot Product Instruction
- DP3 R0.x, R1, R2 -
- R0.x R1.x R2.x R1.y R1.y R1.z R2.z
- DP4 R0.x, R1, R2 -
- 4-component dot product
19MUL instruction
- MUL R1, R0, R2 (component-wise mult.)
- R1.x R0.x R2.x
- R1.y R0.y R2.y
- R1.z R0.z R2.z
- R1.w R0.w R2.w
20MAD instruction
- MAD R1, R2, R3, R4
- R1 R2 R3 R4
- component wise multiplication
- Example
- MAD R1, R0.yzxw, R2.zxyw, -R1
- What does it do?
21Cross Product Coding Example
Cross product R2 R0 x R1 MUL R2, R0.zxyw,
R1.yzxw MAD R2, R0.yzxw, R1.zxyw, -R2
22Lighting instruction
- LIT R1, R0 (Phong light model)
- Input R0 (diffuse, specular, ??, shiness)
- Output R1 (1, diffuse, specularshininess, 1)
- Usually followed by
- DP3 oCOL0, C21, R1 (assuming using
c21) - where Cxx (ka, kd, ks, ??)