+ All Categories
Home > Documents > Demo: bumpy_shiny_patch

Demo: bumpy_shiny_patch

Date post: 27-Jan-2016
Category:
Upload: jonco
View: 43 times
Download: 2 times
Share this document with a friend
Description:
Demo: bumpy_shiny_patch. Cass Everitt. Overview. The bumpy_shiny_patch demo illustrates three key new extensions working together NV_evaluators NV_vertex_program NV_texture_shader - PowerPoint PPT Presentation
Popular Tags:
17
Demo: bumpy_shiny_patch Cass Everitt
Transcript
Page 1: Demo: bumpy_shiny_patch

Demo: bumpy_shiny_patchDemo: bumpy_shiny_patch

Cass Everitt

Page 2: Demo: bumpy_shiny_patch

Overview

• The bumpy_shiny_patch demo illustrates three key new extensions working together • NV_evaluators• NV_vertex_program• NV_texture_shader

• The goal of bumpy_shiny_patch is to render a bumpy, mirrored, and deformable patch -- with an RGB glossmap to boot

Page 3: Demo: bumpy_shiny_patch

Game Plan• Use 4 NV_evaluators maps to generate

• P, dP/du, dP/dv, and (s,t) texture coordinates• Pass these values in to a vertex program

• Use NV_vertex_program to• Produce a set of normalized basis vectors

• T = normalize(dP/du), N = normalize(TdP/Dv), and B = NT

• Calculate the 3x3 “texel matrix” == CMS• basis vectors for S (surface to object space)

• M is the upper 3x3 of the inverse transpose of the MODELVIEW matrix

• C is the rotation from eye-space to world-space (or cubemap-space)

• Put the texel matrix into the appropriate texture coordinates

• Calculate the cubemap space eye vector, and put itinto the appropriate texture coordinates

Page 4: Demo: bumpy_shiny_patch

Game Plan (2)

• Use NV_texture_shader “reflect cube map” dot product program to• Calculate a per-pixel reflection vector based on the

normal map normals and the interpolated cubemap space eye vector

• Use the reflection vector to look into a cubic environment map

• Final “simple” 2D pass to modulate the framebuffer results with an RGB glossmap

Page 5: Demo: bumpy_shiny_patch

NV_evaluators

• Map 0 uses a 4x4 patch for position

• Map 1 uses a 3x4 patch for dP/du• This map is the difference of adjacent columns

from map 0

• Map 2 uses a 4x3 patch for dP/dv• This map is the difference of adjacent rows from

map 0

• Map 8 uses a 2x2 patch for texture coordinates

• The tessellation scheme is irrelevant -- that’s the point!

Page 6: Demo: bumpy_shiny_patch

NV_vertex_program

• The vertex program used to compute all the relevant values is shown

• Note the following program parameter settings• c[0-3]: GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV • c[4]: (1, 2, 0, -1) // misc constants• c[5]: (refract_term, refract_term, 1, bump_scale)• c[8-11]: GL_MODELVIEW, GL_IDENTITY_NV• c[12-15]: GL_MODELVIEW, GL_INVERSE_NV• c[20-22]: modelview_cubemap matrix

(object-space -> cubemap-space transform)• c[43-45]: modelview_negate_cubemap matrix

(object-space position -> cubemap-space eye vector)

Page 7: Demo: bumpy_shiny_patch

NV_vertex_program (2)

!!VP1.0

# positionDP4 o[HPOS].x, c[0], v[OPOS] ;DP4 o[HPOS].y, c[1], v[OPOS] ;DP4 o[HPOS].z, c[2], v[OPOS] ;DP4 o[HPOS].w, c[3], v[OPOS] ;

# R0 = normalize3(v[1]) --- tangentDP3 R0.w, v[1], v[1] ;RSQ R0.w, R0.w ;MUL R0.xyz, v[1], -R0.w ;

# R2 = cross(R0,v[2]) --- normalMUL R2, R0.zxyw, v[2].yzxw ;MAD R2, R0.yzxw, v[2].zxyw, -R2 ;

# R2 = normalize(R2)DP3 R2.w, R2, R2 ;RSQ R2.w, R2.w ;MUL R2.xyz, R2, R2.w ;

# R1 = cross(R0,R2) --- binormalMUL R1, R0.zxyw, R2.yzxw ;MAD R1, R0.yzxw, R2.zxyw, -R1 ;

Page 8: Demo: bumpy_shiny_patch

NV_vertex_program (3)

# We need the "texel matrix" to be (C)(MV)(S)(B), where C is the cubemap# rotation, MV is the modelview matrix and S is the matrix that transforms# vectors from texture space to object space, and B is a simple uniform# scaling matrix. Specifically it is:# | b 0 0 |# B = | 0 b 0 |# | 0 0 1 |## | Tx Bx Nx | | R0.x R1.x R2.x |# S = | Ty By Ny | = | R0.y R1.y R2.y |# | Tz Bz Nz | | R0.z R1.z R2.z |## and (C)(MV) is pre-computed ## | c[20].x c[20].y c[20].z |# (C)(MV) = | c[21].x c[21].y c[21].z |# | c[22].x c[22].y c[22].z |## so (S)(B) is## | R3.x R3.y R3.z | | b*R0.x b*R1.x R2.x |# (S)(B) = | R4.x R4.y R4.z | = | b*R0.y b*R1.y R2.y |# | R5.x R5.y R5.z | | b*R0.z b*R1.z R2.z |#

Page 9: Demo: bumpy_shiny_patch

NV_vertex_program (4)

# so (C)(MV)(S)(B) is## | DP3( c[20], R3) DP3( c[20], R4) DP3( c[20], R5) |# (C)(MV)(S)(B) = | DP3( c[21], R3) DP3( c[21], R4) DP3( c[21], R5) |# | DP3( c[22], R3) DP3( c[22], R4) DP3( c[22], R5) |## | o[TEX1].x o[TEX1].y o[TEX1].z |# = | o[TEX2].x o[TEX2].y o[TEX2].z |# | o[TEX3].x o[TEX3].y o[TEX3].z |

Page 10: Demo: bumpy_shiny_patch

NV_vertex_program (5)

# calculate (S)(B) -- c[5].x = b (bump scale term)MUL R3, R0, c[5].w;MUL R4, R1, c[5].w;

# compute (C)(MV)(S)(B) and put it in the correct texture coordinates# c[20-23] == modelview_cubemap matrix (object-space -> cubemap-space transform)

DP3 o[TEX1].x, c[20], R3; DP3 o[TEX1].y, c[20], R4; DP3 o[TEX1].z, c[20], R2;DP3 o[TEX2].x, c[21], R3; DP3 o[TEX2].y, c[21], R4; DP3 o[TEX2].z, c[21], R2;DP3 o[TEX3].x, c[22], R3; DP3 o[TEX3].y, c[22], R4; DP3 o[TEX3].z, c[22], R2;

# calculate cubemap-space eye vectorDP4 o[TEX1].w, v[OPOS], c[43];DP4 o[TEX2].w, v[OPOS], c[44];DP4 o[TEX3].w, v[OPOS], c[45];

# col0 = white and pass tex0 coordinates throughMOV o[COL0], c[4]; MOV o[TEX0], v[TEX0];

END

Page 11: Demo: bumpy_shiny_patch

NV_texture_shader

• Configure the texture shader stages as follows

// stage 0 -- normal mapglActiveTextureARB( GL_TEXTURE0_ARB );normalmap.bind();glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);

// stage 1 -- dot productglActiveTextureARB( GL_TEXTURE1_ARB );glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_DOT_PRODUCT_NV);glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB);

// stage 2 -- dot productglActiveTextureARB( GL_TEXTURE2_ARB );glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_DOT_PRODUCT_NV);glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB);

// stage 3 -- dot product, cube map lookupglActiveTextureARB( GL_TEXTURE3_ARB );cubemap.bind();glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV);glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB);glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

Page 12: Demo: bumpy_shiny_patch

The Bump Map and Gloss Map

Page 13: Demo: bumpy_shiny_patch

The Environment Map

Page 14: Demo: bumpy_shiny_patch

The Results

Page 15: Demo: bumpy_shiny_patch

Note

• In this example, the upper-left 3x3 of the modelview matrix (M) and the upper-left 3x3 of the inverse transpose of the modelview matrix(M-t) are used interchangeably. This is because the modelview matrix contains only rigid-body transformations (rotation and translation), and in this case the matrices are identical.

Page 16: Demo: bumpy_shiny_patch

Related Information

• See “The dot_product_reflect and dot_product_reflect_torus Demos” presentation and the corresponding demos for simple examples of object-space and tangent-space reflective bump mapping

Page 17: Demo: bumpy_shiny_patch

Questions, comments, feedback

• Cass Everitt, [email protected]

• www.nvidia.com/developer


Recommended