Displacement Shader Writing CSCD 472 Slide 1 4/5/10 Displacement - - PowerPoint PPT Presentation

displacement shader writing
SMART_READER_LITE
LIVE PREVIEW

Displacement Shader Writing CSCD 472 Slide 1 4/5/10 Displacement - - PowerPoint PPT Presentation

Displacement Shader Writing CSCD 472 Slide 1 4/5/10 Displacement Shader Variables CSCD 472 Slide 2 4/5/10 Displacement Shader Variables Of these variables only P (the point being shaded) and N (the non-geometric normal) can be written.


slide-1
SLIDE 1

Slide 1 CSCD 472 4/5/10

Displacement Shader Writing

slide-2
SLIDE 2

Slide 2 CSCD 472 4/5/10

Displacement Shader Variables

slide-3
SLIDE 3

Slide 3 CSCD 472 4/5/10

Displacement Shader Variables

Of these variables only P (the point being shaded) and N (the non-geometric normal) can be written. Displacement vs. Bump

Displacement shaders - the point is displaced along the normal and then a new normal is created. Bump shaders – the point displacement is not saved but a new normal is calculated based on the point displacement.

slide-4
SLIDE 4

Slide 4 CSCD 472 4/5/10

Displacement Shader Variables

Displacement:

displacement d_simplenoise_displ(float Km = 0.03; float noiFreq = 10;) { float noi; noi = noise(transform("shader", P*noiFreq)); P+= normalize(N) * noi * Km; N = calculatenormal(P); }

Bump:

displacement d_simplenoise_bump(float Km = 0.03; float noiFreq = 10;) { float noi; noi = noise(transform("shader", P*noiFreq)); N = calculatenormal(P+ normalize(N) * noi * Km); }

slide-5
SLIDE 5

Slide 5 CSCD 472 4/5/10

Bump vs. Displacement

Object with no Displacement shaders:

slide-6
SLIDE 6

Slide 6 CSCD 472 4/5/10

No Displacement RIB

Display "rock.tiff" "tiff" "rgba" Format 640 480 1

PixelSamples 3 3 PixelFilter "catmull-rom" 3 3 ShadingRate 1.0 Projection "perspective" "fov" 40

WorldBegin

LightSource "ambientlight" 0 "intensity" [ 0.2 ] "lightcolor" [ 1 1 1 ] LightSource "distantlight" 1 "intensity" [ 1.0 ] "lightcolor" [ 1 1 1 ] "from" [ -1 1 -1 ] "to" [ 0 0 0 ] LightSource "distantlight" 2 "intensity" [ 0.75 ] "lightcolor" [ 1 1 1 ] "from" [ 1 1 -2 ] "to" [ 0 0 0 ] LightSource "distantlight" 3 "intensity" [ 0.5 ] "lightcolor" [ 1 1 1 ] "from" [ 1 -1 -1 ] "to" [ 0 0 0 ]

#Displacement "d_simplenoise_bump" "Km" [0.5] "noiFreq" [5] Surface "rock" "float ringdensity" [10] "float spread" [3] "color darkcolor" [0.3 0.6 0.3] Color [.6 .4 .4] Translate 0 0 4 Rotate -90 1 0 0 Rotate 90 0 1 0 Scale .85 .85 1.2 Sphere 1 -1 1 360 WorldEnd

slide-7
SLIDE 7

Slide 7 CSCD 472 4/5/10

No Displacement- rock.sl

surface rock( float Ka=1, Kd=.6, Ks=0.4, roughness=0.2, ringdensity=4, swirl=0.25, swirlfreq=1, spread=1; point c0=point "shader" (0,0,0); color specularcolor=1, darkcolor=0.7) { point C0, newP; normal Nf; vector V, PP; float dd, alpha; color Cwood; Nf = faceforward( normalize(N), I); V = -normalize(I); C0 = transform("shader", c0); newP = transform("shader", P); PP = newP - C0; dd = sqrt(abs(PP.PP)); alpha = mod(ringdensity*dd, 1); alpha = pow(alpha, spread); alpha = 1 - alpha; Cwood = mix(darkcolor, Cs, alpha); Oi = Os; Ci = Oi * (Cwood * (Ka*ambient() + Kd*diffuse(Nf) ) + Ks * specularcolor * specular(Nf, V, roughness)); }

slide-8
SLIDE 8

Slide 8 CSCD 472 4/5/10

rock.sl - Discussion

PP is the vector from P to the origin of shader coords so dd is the distance from P to the origin of shader coords. alpha is the fractional part of dd*ringdensity mod function: mod(a,b) returns a value from 0 to b with the fractional part of a. taking alpha to the spread power makes it smaller, then invert alpha and use it to mix Cs and darkcolor. Basically rock.sl produces a sort of wood grain texture.

slide-9
SLIDE 9

Slide 9 CSCD 472 4/5/10

Bump vs. Displacement

Add the Displacement shader d_simplenoise_bump.sl Outline is smooth because only normals are changed – no displacement.

slide-10
SLIDE 10

Slide 10 CSCD 472 4/5/10

Bump vs. Displacement

Replace d_simplenoise_bump.sl with d_simplenoise_displ.sl Outline is altered because now true displacements are taken.

slide-11
SLIDE 11

Slide 11 CSCD 472 4/5/10

Bump vs. Displacement

slide-12
SLIDE 12

Slide 12 CSCD 472 4/5/10

Cracks with large displacements

Occur when a displacement extends beyond the bounding box of the current render bucket.

slide-13
SLIDE 13

Slide 13 CSCD 472 4/5/10

Cracks Fix

Attribute "displacementbound" "coordinatesystem" ["shader"] "sphere" [0.5] Defines a new bounding area for use by the shading engine If new area is too large – slow rendering If too small cracks reappear.

slide-14
SLIDE 14

Slide 14 CSCD 472 4/5/10

Displacing Polygons

After points are displaced normals must be recalculated.

In a polygon mesh model the important normals are the averaged “vertex” normals and they can not be re-established easily. The function calculatenormal() calculates purely geometric normals (Ng) or polygon normals so following recalculation a smooth surface often becomes faceted -as shown in the next slide.

slide-15
SLIDE 15

Slide 15 CSCD 472 4/5/10

Loss of Smoothness in Polygon Meshes

No Displacement After Displacement

displacement d_simple() { P+= P * normalize(N)*.01; N = calculatenormal(P); }

slide-16
SLIDE 16

Slide 16 CSCD 472 4/5/10

Correctly calculating Normals

Fixing the situation:

Take the difference between the shading or vertex normal (N) and the geometric normal (Ng) and store it. After recalculating the new geometric normal add the saved difference to form the new shading normal N.

displacement d_simple_fix() { varying normal Ndiff; Ndiff= normalize(N) - normalize(Ng); P+= P * normalize(N) *.01; N = normalize(calculatenormal(P)) + Ndiff; }

slide-17
SLIDE 17

Slide 17 CSCD 472 4/5/10

Correctly Calculating Normals

Original and uncorrected Normals Corrected Normals

slide-18
SLIDE 18

Slide 18 CSCD 472 4/5/10

Fixing Loss of Smoothness in Polygon Meshes

No Displacement After Displacement After Displacement with Normal fix.