1.07k likes | 1.33k Vues
CSE3AGT – Zones Portals and Anti-Portals, Fog and Ray Tracing. Paul Taylor 2010. Zones, Portals and Anti-Portals. With Pictures!. Zones. Air-tight areas of your level that constitute different areas. http://www.hourences.com/book/tutorialszoning.htm. Portals.
E N D
CSE3AGT – Zones Portals and Anti-Portals, Fog and Ray Tracing Paul Taylor 2010
Zones, Portals and Anti-Portals With Pictures!
Zones • Air-tight areas of your level that constitute different areas. http://www.hourences.com/book/tutorialszoning.htm
Portals • These are the windows between your Zones • You can either think of zones as airtight areas, or pretend to fill them with water
Occlusion Planes • A newer advance in pre-rendering occlusion • This was one of the key technologies that enabled large open-world games to be created • A plane which is inserted into any object which is large enough to be a ‘good’ occluder
Get Creative! • Don’t forget your ceilings and floors! • You should keep your visibleoccluders down to only like 3 or 4
Bonuses • Much shorter Z-Depth Required before culling • Heavy Fog can be used in situations of high complexity • Even on a ‘Sunny Clear Day’ with huge draw-distances, fog can be used to stop pop-in
Negatives More code in your shaders • Easily offset by the savings in polygons Some extra possible issues with artefacts • Fatter Vertices
How? Two Main Methods: • Vertex Based Fog - Cheaper • Table Based Fog (Pixel Fog) - Expensive Important Attributes • Distance (range / plane) • Drop Off (Very similar to lighting!) • Z or W based
Vertex Fog Functions in a similar way to Per Vertex Colours, or Per Vertex Lighting Fog values are interpolated across polygons based on Vertex Values • All the usual per-vertex problems apply here too!
Range • Ranged based fog has a start and an end • Vertices before the FogStart are unfogged, Vertices after FogEnd are Completely obscured • A function is used to interpolate from FogStart to FogEnd • Simplest: Linear Interpolation • More complex: Eg: Exponential, quadratic, etc.
Exponential Fog (2 types) • D = distance from viewpoint • Density = Variable from 0.0 to 1.0 • The second equation has a steeper gradient through the middle section http://msdn.microsoft.com/en-us/library/bb173401%28VS.85%29.aspx
Exponential Fog Curves Linear Fog
Z-Fog The most basic Pixel Fog is Z-Fog (Depth-Fog) Things that can go wrong: Tilting on the Y axis results in: http://cs.gmu.edu/~jchen/cs662/fog.pdf
Why does it happen? Side View of the previous slide
How can we solve it? • We could Fix the rotation on the Y axis • Or we could calculate the true distance from eye to each pixel. • It just so happens that we can get this value for free (Processing wise, we will need an extra float per vertex)
W-Fog (The DX9 Way) • What is W? • How do we make sure W exists? • Both these matrices will work perfectly as an XYZ projection matrix. • Below will create a W = Z * S. not exactly helpful. • Above will
W-Fog the DX10 Way W Fog is easy, we already use world coordinates for vertices in our lighting, so we can just add a float to pass the eye-vertex distance to the pixel shader
Newest Fog Technologies • Technical Innovations to reduce your visibility! • If you want to be ‘at the front’ you need to be looking for papers from Google Scholar! • Take each idea you like, figure out how it’s done, then figure out what you could do better! • The following is from the latest build of the UDK
Exponential Height Fog • New kind of global fog with density that decreases with height • Never creates a hard line (unlike standard fog); supports one layer • Can specify both "towards the light" and "away from the light" colours • Rendering cost similar to two layers of constant density height fog • Can now use different colours for the hemisphere facing the light and vice versa
Exponential Height Fog http://udn.epicgames.com/Three/rsrc/Three/ContentBlog/1ExpResized.jpg
Pipelines are for Chumps Raycasting and Raytracing
Ray Casting • Definition Time • There are two definitions of Ray Casting • The Old and the New • The old was related to 3D games back in the Wolfenstein / Doom 1 Era. Where gameplay was on a 2D platform • The New definition is: • Non Recursive Ray Tracing
Ray Tracing • http://www.flipcode.com/archives/Raytracing_Topics_Techniques-Part_1_Introduction.shtml Glass Ball
Rays from the Sun or from the Screen • Rays could be programmed to work in either direction • We choose from the screen to the Light • Only X x Y Pixels to trace • From the Light we would need to emulate Millions of Rays to find the few thousand that reach the screen
Center of Projection (0,0)
Viewport (0,0) Screen Clipping Planes
Into World Coordinates (0,0) Screen Clipping Planes
Getting Each Initial Ray • Origin = (0,0,0) • Direction = ScreenX,screenY, zMin • ScreenX, ScreenY are the float locations of each pixel in projected world coordinates • zMin is the plane on which the screen exists
Surface Materials • Surfaces must have their Material Properties set • Diffuse, Reflective, Emissive, and Colour need to be considered
For Each Pixel (the main Raytrace loop) For each pixel { Construct ray from camera through pixel Find first primitive hit by ray Determine colour at intersection point Draw colour to pixel Buffer }
Intersections • The simplest way is to loop through all your primitives (All Polygons) • If the Polygon Normal DOT RayDirection(Cos Theta) < 0 // Face is opposite to Ray Ignore • Now we can Intersect the Ray with the Polygon • Or Intersect the Ray with the Polygons Plane
Ray / Polygon Intersection p0, p1 and p2 are verts of the triangle point(u,v) = (1-u-v)*p0 + u*p1 + v*p2 U > 0 V > 0 U + V <= 1.0
Line Representation point(t) = p + t * d t is any point on the line p is a known point on the line D is the direction vector Combined: p + t * d = (1-u-v) * p0 + u * p1 + v * p2 A Point on the line (p + t * d) which Is part of the triangle [(1-u-v) * p0 + u * p1 + v * p2]
http://www.lighthouse3d.com/opengl/maths/index.php?raytriint
Intersections Suck! • http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/ • http://www.netcomuk.co.uk/~jenolive/vect18c.html • http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm#Line-Plane%20Intersection • http://members.tripod.com/~Paul_Kirby/vector/Vplanelineint.html
Intersecting a Plane • A point on the Plane = p1 • Plane Normal = n. • Ray = p(t) = e + td P(t) = Point on Ray E = Origin D = Direction Vector t = [(P1 – e) . n]/ d.n
World / Object Coordiantes • We need to translate the Ray into Object Coordinates / Vice Versa to get this to work • Ray = p(t) = e + td • Ray = Inv (Object->World)e + t Inv (Object->World)d