380 likes | 615 Views
Advanced rendering techniques. 4/2/02. Rendering for animation. The big difference: real time vs. off-line Real time: sacrifice quality for performance Hardware support necessary Use polygons and scanline rendering Use simple lighting models Phong+diffuse+ambient
E N D
Rendering for animation • The big difference: real time vs. off-line • Real time: sacrifice quality for performance • Hardware support necessary • Use polygons and scanline rendering • Use simple lighting models • Phong+diffuse+ambient • New hardware might change this • Applications: interactive systems • Games • Walkthroughs
Off-line rendering • Primary goal: get the “right” appearance • Less concern about time • Done in software – great flexibility • Not only triangles • Not only Phong • Can use different rendering techniques • Raytracing • Radiosity • REYES
Ray tracing • The idea: follow light propagation through the scene • Algorithm: • Shoot a ray through eye position and pixel center • Determine the first surface it intersects with • Compute surface color: • Shoot new rays to light sources (shadow rays) • If blocked, no contribution • Account for surface reflection, light and viewing direction
Recursive ray tracing • If surface is a mirror: • Shoot new ray in mirror direction • Repeat the process • If surface is diffuse: • Terminate • Alternative: shoot a ray in random direction • Called pathtracing – very slow • Always terminate once contribution is small • Rays carry light energy
Stochastic supersampling • Ray through the pixel center – aliasing artifacts • Increase number of rays per pixel, average results • supersampling • Better if point is chosen randomly • Stochastic sampling • Turn regular artifacts into noise
Advantages / disadvantages • Mirror reflections / refractions are easy • Arbitrary surface reflectance properties • BRDFs • Diffuse interreflections are difficult • Can be very slow • Need extra acceleration datastructures • Grids, octrees, etc. • With these, speed is ok on modern machines • Scanline performance: number of objects • Raytracing performance: image resolution
Radiosity • Assumption: all surfaces are Lambertian • Uniformly diffuse • Split all surfaces into patches • Chose a point on each patch • Light reflected from a patch at a point = linear combination of light from other points • Coefficients depends on mutual arrangement
Radiosity • Write equations of light transfer • Compute patch-to-patch transfer coefficients • Form factors • Solve this system • Get patch color at one point • Interpolate to get color everywhere on the patch
Radiosity • Lots of different algorithms to: • Split surfaces into patches • Respecting shadow boundaries, etc. • Compute form factors • Solve radiosity system of equations • Efficient methods for special “sparse” systems • Take into account only significant energy exchanges • Some form is implemented in Blender
Advantages / disadvantages • Very nice images of diffuse environments • A rather complex algorithm • Form factor computation is slow • Does not handle mirrors • Some form of raytracing is needed • Currently somewhat decreasing in popularity
REYES system • Champion in longevity • Created in mid-80s by what now Pixar • Basis for RenderMan – standard rendering tool for movie industry • 1993 Academy award (“Oscar”) • Major ideas: • Splitting and dicing of primitives • Surface shaders
Splitting and dicing • Determine if a primitive is on the screen • Compute primitive size on the screen • Use bounding boxes • Split if the size is “too large” • Dicing – conversion to a “grid” • Tesselation into mycropolygons • Size is about 1 pixel • Their vertices are shaded
Shader concept • Primitives have shaders attached to it • Shader – program which determines relevant parameters • Not only surface color (surface shaders) • Displacement shaders • Light shaders • Volume shaders • Imager shaders (BMRT only)
Visible surface determination • Determine which pixels are affected by micropol. • Each pixel has list of sample positions • Stochastic point samples • Test which are covered by a micropol. • Each sample has associated visible point list • Includes depth and transparency • Once done, determine pixel color
Enhanced REYES • Memory usage problem • Visible point lists are huge • Use buckets – small pixel regions • Sort primitives into buckets • Process one bucket at a time • Occlusion culling • Sort primitives by depth in each bucket • Process close objects first
RenderMan / BMRT 4/4/02
RenderMan rendering interface • RenderMan also specifies a rendering interface • Independent of implementation • REYES system in Pixar’s RenderMan • Raytracing in BMRT • Mostly transparent for the user • Analog: OpenGL is an interface • Hardware support – driver hides the details • Software implementation (Mesa)
RenderMan interface • Scene description file • .rib (RenderMan interface bytestream) • Compiled shaders • .slc – used by RenderMan directly • Shading language • High level C-like language • .sl – run a compiler to convert into .slc
Using RenderMan • It is run from a command line • Run “setenv” first to set up paths • rgl – fast OpenGL previewer • Good for geometry/lights/camera positioning • Usage: rgl ribname.rib • slc - shader language compiler: • slc shadername.sl • Produces shadername.slc • Need to do this for all shaders used
Using RenderMan • rendrib is the renderer • rendrib ribname.rib • Creates output according to rib specs • Use –d to get display output directly • -d 16 to get multiresolution approximation • Raytracing complex scenes can be slow • Debug shaders on simple geometry
.rib file anatomy Global options Frame block Image options Camera options World block Attributes, lights, primitives Changed options Another world block Next frame block
Parameter declarations • Can declare parameters with • Declare “name” “declaration” • declaration is an analog of type • class type actually • Type = float, color, vertex, vector, normal, point, string, matrix • This is global • In-line decraration – only in particular command • “class type name”
Attribute blocks • Everything between AttributeBegin and AttributeEnd • Inherits attribute state of the parent • Manipulates it, assigns to geometric primitives • Attribute state: • color/shaders attached • Transformation matrices • TransformBegin / TransformEnd push/pop transform matrices
Transformations • Applies to local coord system • Rotate angle vx vy vz • Scale sx sy sz • Skew angle vx vy vz ax ay az • ConcatTransform matrix • Identity • Transform matrix
Special coord systems • Camera space • Origin at the camera, Z+ in front, Y+ is up • Left-handed !!! • Created with • Projection type parameterlist • Everything else is relative to it • Before WorldBegin – form world-to-camera matrix • Each object/shader created according to current transform matrix • Coord system is stored as “object” / “shader” space
Geometry • Quadrics: • Sphere, cylinder, cone, paraboloid, hyperboloid, disk, torus • Polygons and meshes: • Polygon, GeneralPolygon, PointsPolygon, PointsGeneralPolygon • Parametric patches and NURBS: • Basis, Patch, PatchMesh, NuPatch • Other: trim curves, subdivision meshes, CSG
Primitive variables • Attached to geometric primitives • Can be referred to directly: • “P”, “Pw”, “N”, “Cs”, “Os”, “st” • These are: • Position in 3D (P), and in hc (Pw) • Normal (N) • Surface color (Cs) and opacity (Os) • Texture coords (st)
Shaders • In .rib file, created by: • Surface “shadername” parameterlist • Displacement “shadername” parameterlist • Parameters are passed to the shader program • Written in special shading language • Has access to some global variables • Sets some global variables • Final surface color Ci and opacity Oi • Can also modify position P and normal N • Displacement shader
A simple shader Surfacemetal (float Ka = 1, Ks = 1; float roughness = .1;) { normal Nf = faceforward (normalize(N),I); vector V = -normalize(I); Ci = Cs * (Ka*ambient() + Ks*specular(Nf,V,roughness)); Oi = Os; Ci *= Oi; }
Simple shader usage • In .rib file the usage will be: AttributeBegin Translate 0 0 0 Color 1 .3 .05 Surface "metal" "roughness" [0.3] "Ks" [1.5] ReadArchive "vase.rib" AttributeEnd
Simple shader notes • Global variables: N, I, Oi, Os, Ci, Cs • Sets final surface color Ci • Cs is from .rib file • Parameters Ka, Ks, roughness are from shader parameterlist in .rib • Shader language functions: • Uses default ambient() and specular(…) to do actual computation • There is also diffuse(…) • Normalize(), faceforward()
Lights and illumination • Can access light information in illumination loops color diffuse (normal Nn){ extern point P; color C=0; illuminance(P,Nn,PI/2){ C+=Cl*(Nn . Normalize(L)) } return C; } • Loops over all visible lights from P which are within PI/2 from Nn
BMRT • BMRT implements RenderMan interface • But it is a raytracer • Extra features available • color trace(point from; vector dir) returns incoming light from dir • Also Fulltrace, rayhittest, visibility, etc. • RayTrace(…) – stochastic supersampling • Easy to do reflections
Simple shader using raytracing color MaterialShinyMetal (normal Nf; color basecolor; float Ka, Kd, Ks, roughness, Kr, blur; uniform float twosided; DECLARE_ENVPARAMS;) { extern point P; extern vector I; extern normal N; float kr = Kr;
…continued if (twosided == 0 && N.I > 0) kr = 0; vector IN = normalize(I), V = -IN; vector R = reflect (IN, Nf); return basecolor * (Ka*ambient() + Kd*diffuse(Nf) + Ks*specular(Nf,V,roughness) + SampleEnvironment (P, R, kr, blur, ENVPARAMS)); }
Notes on raytracing shader • Mostly as before • SampleEnvironment calls RayTrace • Also includes environment mapping • See reflections.h • ENVPARAMS is a bunch of stuff controlling ray tracing / env. mapping • Number of samples, env.map name, etc.
Concluding notes • Real power of RenderMan is in its flexibility • Want complex appearance – just write a shader function • Hundreds of parameters for complex shaders • Will see more on procedural techniques later in the course • Including possibilities for some interesting shaders • Assignment 5 asks you to play with shaders • And write a few of your own…