SlideShare uma empresa Scribd logo
1 de 78
Will Vale
Second Intention Limited
   Freelancer with graphics tech bias
   Working with Guerrilla since 2005
   Talking about occlusion culling in KILLZONE 3
   Background: Why do occlusion culling?
   The SPU runtime (rendering and testing)
   Creating workable occluders
   Useful debugging tools
   Problems and performance
   Results, and thoughts on where to go next
Drawing these guys
 is a waste of time
   Scene geometry in a Kd-Tree
   Culled using zones, portals and blockers
   Problems:
       Lots of artist time to place and tweak
       Entirely static
       Geometric complexity
            Lots of tests, fiddly code
       Too much time – around 10-30% of one SPU (serial)
   Can't feed RSX until it's done
PPU   Other
      work
                Prepare
                to draw
                               Kick                       Other work




SPU           Other work                Scene query   Build main display list
                                                                                        Other
                                                                                      rendering



SPU                        Other work                               Other rendering




SPU                        Other work                               Other rendering




SPU                        Other work                               Other rendering




SPU                        Other work                               Other rendering
PPU   Prepare
      to draw
                 Kick




SPU                        Scene query     Build main display list




                 Scene            Query
                database          result

                 Kd-Tree         Objects
                                                                      Main
                  Zones           Parts
                                                                     memory
                 Portals         Lights
   Increase scene complexity
       Larger, more open environments
       With more stuff in them
   Simplify content pipeline
       Don't waste artist time on things which aren't pretty
       Don't require artist tweaks – but allow them
   80% solution
       Want it to “just work” 80% of the time
   Don't increase RSX load
       Never enough GPU time that we can waste it
   Fully conservative solution
       No popping when you go around corners
   Drop into pipeline without restructuring
       Reduce risk
       Allow swapping between implementations at runtime
   Some spare memory
   Some spare SPU time
   Best guess: create and test a depth buffer on SPUs
       Decouples tests and occluders
       Rendering linear in number of occluders
       Testing linear in number of objects
   Plays to SPU strengths
   Culls early
   Create occluder geometry offline
   Each frame, SPUs render occluders to 720p depth buffer
   Split buffer into 16 pixel high slices for rasterisation
   Down-sample buffer to 80x45 (16x16 max filter)
   Test bounding boxes against this during scene traversal
       Accurate: Rasterisation + depth test
       Coarse: Some kind of constant-time point test
PPU       …                                        Other work




SPU   …
              Scene
              query
                           Setup   Rasterise   Filter
                                                           Occluded
                                                            query
                                                                       Build main
                                                                       display list
                                                                                             ...


 SP           Other work           Rasterise
                                               Other        Occluded
                                                                           Other rendering
                                               work          query
 U
 SP           Other work           Rasterise
                                               Other        Occluded
                                                                           Other rendering
                                               work          query
 U
 SP           Other work           Rasterise
                                               Other        Occluded
                                                                           Other rendering
                                               work          query
 U
 SP           Other work           Rasterise
                                               Other        Occluded
                                                                           Other rendering
                                               work          query
 U
PPU             …




SPU                 Scene
                    query
                                 Setup       Rasterise      Filter
                                                                      Occluded
                                                                       query
                                                                                    Build main
                                                                                    display list




   Scene               Query             Staging         Occlusion        Query
  database             result             area            buffer          result
                                                                                                    Main
      Kd-Tree         Occluder           Projected       Depth data       Objects
                      meshes             occluder                          Parts
                                                                                                   memory
                                         triangles
                                                                          Lights
s ld




       Block                              Size         Count              Total
       Global triangles                   48 bytes     4096               192KB
       DMA list entries                   8 bytes      23K                184KB
       Job commands                                                       3KB
                                                               Grand total 379KB


          NB:
              We originally rasterised at 720p
              Ended up shipping with 640x360 (see later)
              Memory and performance figures are for this option
   Finds occluders in the (truncated) view frustum
   Occluders are normal rendering primitives
       Live with the rest of a drawable object, identified by flag bit

                                       Extract       Sort
                        Walk Kd-                                  Output
           Query         tree
                                      occluder
                                        parts
                                                   occluders
                                                    by size
                                                                   list



 Main                                  Mesh                       Query
                         Kd-tree
memory                                 data                       result
   Decodes RSX-style vertex and index arrays
   Outputs clipped + projected triangles to staging area
   Internal pipeline to hide DMA latency
                    Resolve indirection in engine data                                   Workload

                  Load           Load           Load           Prime        Prime       Process
         Setup   address         part           arrays        indices      vertices     (global write
                 (local copy)   (local copy)   (local copy)   (1K cache)   (2k cache)     caches)




 Main             Query         Engine          Array          Index       Vertex       Staging
memory            result        structs        headers         array       array         area
Block                  Size             Count               Total
Triangle write cache   6KB              1                   6KB
DMA list write cache   1.5KB            23                  34.5KB
Index cache            1KB              6                   6KB
Vertex data cache      2KB              6                   12KB
Post-transform cache   ~600b            6                   ~3.5KB
                       Smaller data, alignment slop etc.    11KB
                                               Total data   73KB
                                                   Stack    8KB
                                                   Code     40KB
                                             Grand total    105KB
   First three stages load small (bytes rather than KB) engine structs
   Index data streamed through 1K cache
        First read pipelined, later reads block
        Occluders diced so they usually fit in one go
   Vertex data streamed through 2K cache
        First read pipelined again
        90% hit rate
   32-entry post-transform cache
        Direct mapped, not a FIFO
        60% hit rate
   Last stage does all the heavy lifting
   Decode vertices from 32-bit float or 16-bit integer
        RSX formats
   No-clipping path
        Primitive bounds lie inside frustum
        Store projected vertices in post-transform cache
   Clipping path
        Only when required
        Cull/clip triangles against near and far planes
              „Scissor‟ test handles image extents later
        Store clip-space vertices in post-transform cache
        Branchless clipper
   Cull projected triangles against image extents
   Send visible triangles to staging area in main memory
       Store one copy of each triangle
            via 6KB double-buffered write cache
       Store DMA list entry for each strip under the triangle
            via 1.5KB double-buffered write cache
            Saves memory (8 byte entries vs. 48-byte triangles)
       If we run out of staging space, ignore excess triangles
   Then setup and kick rasteriser jobs
   Launch one rasterise job per strip
   Load triangles from staging area using list DMA
   Draw triangles to a floating point 640x16 depth buffer in LS
   Compress depth buffer to uint16 and store

                                   Setup and    Compress
                       List DMA                                Output
          Rasterise      input
                                       draw       depth
                                                              scanline
                                    triangles     buffer



 Main                  Staging                               Occlusion
memory                  area                                  buffer
Block                   Size             Count             Total
Input triangle buffer   48KB             1                 48KB
Depth buffer            20KB             1                 20KB
Output scanline         <1KB             1                 <1KB
                        Smaller data, alignment slop etc. ~1KB
                                              Total data 70KB
                                                  Stack 8KB
                                                   Code 11KB
                                             Grand total   89KB
   Traditional scanline rasterisation                   p2
                                                         p1
        Paid attention to triangle setup speed
        Also considered half spaces                          p1‟
                                                  y=0
        Not tried this yet though
   Handle four edges at once (SoA)
   Sort edges start and end on Y
        Using shuffle table
   Clip edges to strip                                             p1
                                                                    p2
   Walk edges and write X, Z pairs into 16-
    entry span table

                                                  y=15
   Outer loop over span table
       C-with-intrinsics
   Inner loop along scanline            y=0
       SPA assembler
   4-pixel-wide SIMD
       Interpolate depth values
       Depth test and write if nearer
       Mask writes at start and end

                                         y=15
   Down-sample each 16x16 tile to 1 depth value
        Take maximum so depth is conservative
   Encode depth values as unsigned short
        Scale float value such that the far plane is at 0xfffe
        Take the ceiling of the scaled value
        Reserve 0xffff for infinity
              Occlusion frustum is much less deep than view frustum
   Each rasterise job produces one row of the occlusion buffer (one tile high)
        DMA row back to main memory
        Full-size image never really exists
   Last job out kicks the filter job
        Synchronise with simple semaphore
   Actually we cheat a bit 
       Take 2x2 minimum before 16x16 maximum down-sample
       Patches holes cheaply – input isn't perfect
       Otherwise a single pixel hole becomes an entire tile!


                        I SEE
                        YOU!
   Runs after rasterisation is complete
   Generates coarse reject data
        Used during query to cull small objects
   Writes back to reject buffer (contiguous with occlusion buffer)

                             Read
                                                    Generate
            Filter          depth
                                                   reject data
                                                                 Write back
                            values



 Main                      Occlusion                                  Reject
memory                      buffer                                    buffer
   Tests work in a two-level hierarchy
        Objects live in the Kd-tree, and contain multiple parts
   Test objects to avoid extracting parts
   Test parts to avoid drawing them
   Final query result written to main memory and used to build display list


                                                                               Write
                                Walk          Test         Extract   Test
             Query++           Kd-tree       objects        parts    parts
                                                                               visible
                                                                                parts



 Main                          Kd-tree                                         Query
                                                         Mesh data
memory                          data                                           result
   Rasterise front-facing quads of bounding box
       At resolution of occlusion buffer (40x23)
       Early out and return visible as soon as a scan-line passes depth test
   Same code as occluders, smaller buffer
       Small quad optimisations important
       Native quad support avoids setting up two triangles
   Relatively expensive
       Rasterisation is costly
       Times 500-1500 objects with 2000-4000 parts
   Use extra levels of reject data
        Same size as top level
        Conservatively re-sampled
        Test bounding spheres against this buffer if they are small enough
        Fall back to raster test if a given object or part is too large
   Much cheaper
        Constant time tests
   But limited
        Only support spheres of certain radii
        Large radius: more sphere tests, but more false positives
        Small radius: more raster tests, but fewer false positives
   Sample occlusion frame
       Transform 100 occluders
       With 1500 global triangles (2200 across strips)
       Fill 500K pixels @ 640x360
       Test 1000 objects
       Test 2700 parts
   Timings
       Setup job: 0.5ms
       Rasterise job: 2.0ms (on 5 SPUs)
       Query job: 4.5ms (on 5 SPUs) with 1.0ms doing occlusion queries
       Overall latency: ~2ms
   Intended to build occluders from existing visual
    meshes
       Avoid creating too much data
       Use same vertex buffer with new index buffer
       QEMM-simplified or some other method of reduction
   Easy to get started with test data
       Just render everything
   We used this for initial runtime development
   Problems with this approach
       Far too much data
       Hard to reduce without losing silhouette
       Not closed
            Holes in the occlusion buffer
            Even worse with back-face culling
   Needed something better
       Turned out we already had a good candidate
   Good properties:
       Closed
       Simple
   Somewhat accurate
       We have to be able to shoot it
       Not really accurate enough
            Didn't realise this until quite late
   Still way too much of it
       Small occluders
       Holey occluders
Good   Bad
   Filter based on content meta-data
       Walls, floors, ceilings, terrain = good
       Set dressing, props, clutter = bad
   Filter based on geometry
       Don't create really small occluders at all
       Compare total area of triangles against surface area of bounds
       Throw away anything below a given threshold
            Actually use several thresholds, based on size
   Gives us reasonable starting point
   Needed the human touch to get the best out of the system
   Tagging
       Never, Always, or Auto (in which case let heuristics decide)
   Custom occluders
       Artists can provide their own meshes
       Give these priority at runtime during sort
       Often just 2-sided quads, or boxes
       Cheap to author, cheap to render
   Testing a system like this is hard
   If you did a good job…
       …then there are no visible results 
   Makes it hard to prove you‟ve done any work…
   Three main modes
   Common display:
       Occlusion buffer
       Timings, stats, warnings
   Can take screen shot of
    occlusion buffer
       For debugging the
        rasteriser
   Lit depth-tested translucent geometry
       Cheap, since we're rendering from hardware-style vertex and index
        buffers.
   Colour coding
       Important/custom
       Active/inactive
       Overflows
   Important mode for artists
       Did my custom occluder work?
   Draw bounding boxes when objects are culled out
       Drawing the not-drawn stuff
   Colour coded by type
       Objects, parts, lights, etc.
   Good for demos
       “Wow, look at all that stuff I can't see!”
       And rough performance tuning
   Draw the occlusion buffer tiles on the screen
   Transparency-coded for depth
   Good for checking conservatism is working right
   Also used by artists when checking for occlusion
    leaks
   Existing scene debug tool
       Uses player camera for the frustum
       But debug camera for the renderer
   Very useful for testing culling
       Frustum and occlusion
   All games should have this!
Might get fired here…
   Initially tried a bit too hard to get good SPU performance
        Used sphere tests only for some situations
        So we didn‟t get enough RSX culling
   Had to make sure we do full tests on all objects
        Makes optimisation even more important
   Rasterisation and testing too expensive
        Both largely bound by fill rate
        Already worked on triangle setup
   720p occlusion buffer was a headache…
   But it did provide a lot of headroom:
        Downsize to 360p – 40x23 tiles rather than 80x45
        Instant fourfold speedup!
   Possible artifacts
        Already have 2 pixel artifacts from gap removal – this makes them 4 pixel
        Still quite small 
   Checked it in quietly…
   Other significant optimisations
       Temporal coherence
            Assume an object is visible if it was last frame
            Use feedback from testing parts to update status
       Split query job into serial and parallel parts
            Serial: Walk Kd-Tree and generate object list
            Parallel: Test objects and extract parts
       Sub-mesh culling
            Use spatial Kd-Tree inside a mesh to cull it in arbitrarily small pieces
            Keep slicing and testing until we get to the break-even point
   We had some specific problems with skinny objects
        Radius too large for sphere tests
        Not enough pixels generated during raster tests for reliable result
   Didn‟t want to use conservative rasterisation
        Too risky too late
        Would have made all objects bigger, but we had only a few problem objects
   Test a diagonal of each quad
        If the diagonal is visible, the quad is visible
        If not, test the quad
   Fixed the skinny objects, plus it saved some time overall
   Code production costs
       Two man-months to get initial implementation running
       One month to switch to physics meshes and make everything
        robust for production
       Two months bug fixing and optimisation
   Runtime costs
       ~400KB scratch memory per view
       20-50% of one SPU (for everything)
   Pros
       Relatively fast, with room to optimise further
       Stable and predictable performance
       Completely dynamic
       Excellent occluder fusion
   Cons
       Still needed artist work to get levels running fast enough
       But easier to do than with old system
       Campaign levels: 5-10% of occluders custom made
       Multi player levels: 20-50% of occluders custom made 
       Should have anticipated this earlier and changed workflow to suit
   will@secondintention.com
   Slides will be in the GDC Vault
   Also on http://www.secondintention.com/
   Thanks for listening!
       Thanks to everyone at Guerrilla for being awesome!
       Special thanks to Incognito for their sample code
   Tame software rasteriser = opportunity
   Rendering AI depth cubemaps
       Combined with caching and offline generation
       Use idle time
       Reasoning in dynamic worlds!
       Experiments are promising...
   Rendering sun occlusion
       For really cool glares
       Use idle time
       Like the speeder bike sequence in Jedi
   Reduce the number of tests
       CHC – Wimmer + Bittner – GPU gems 2 Ch. 6
       Much easier without the GPU involved
       Visible last frame?
            Assume visible this frame, and skip the test
       Update assumption based on low level tests
            Usually use GPU feedback for this
            We use feedback from part tests instead
   Parallelise scenegraph job
       Kd-Tree part is fast but complicated – serial
       Extracting parts from objects is slow but dumb – parallel
       Works really well
       Same IO as usual
       Output into array without locks using atomic reservations
       Lots more space in LS for each job
            Bigger caches
   Job code starts as C/C++
   Optimise when we have real data
   Structural code stays C/C++
       Lots of C style
       Mix in intrinsics where necessary
            To get SIMD
            To get to instruction set
       Can be 10x faster
   SPA for inner loops
       2x faster again

Mais conteúdo relacionado

Mais procurados

Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Tiago Sousa
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteElectronic Arts / DICE
 
Decima Engine: Visibility in Horizon Zero Dawn
Decima Engine: Visibility in Horizon Zero DawnDecima Engine: Visibility in Horizon Zero Dawn
Decima Engine: Visibility in Horizon Zero DawnGuerrilla
 
Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3Guerrilla
 
Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)Takahiro Harada
 
Rendering AAA-Quality Characters of Project A1
Rendering AAA-Quality Characters of Project A1Rendering AAA-Quality Characters of Project A1
Rendering AAA-Quality Characters of Project A1Ki Hyunwoo
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingYEONG-CHEON YOU
 
Progressive Lightmapper: An Introduction to Lightmapping in Unity
Progressive Lightmapper: An Introduction to Lightmapping in UnityProgressive Lightmapper: An Introduction to Lightmapping in Unity
Progressive Lightmapper: An Introduction to Lightmapping in UnityUnity Technologies
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologyTiago Sousa
 
Terrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable SystemTerrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable SystemElectronic Arts / DICE
 
Deferred Lighting and Post Processing on PLAYSTATION®3
Deferred Lighting and Post Processing on PLAYSTATION®3Deferred Lighting and Post Processing on PLAYSTATION®3
Deferred Lighting and Post Processing on PLAYSTATION®3Slide_N
 
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...Johan Andersson
 
Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1
Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1
Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1Ki Hyunwoo
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2Guerrilla
 
Screen Space Reflections in The Surge
Screen Space Reflections in The SurgeScreen Space Reflections in The Surge
Screen Space Reflections in The SurgeMichele Giacalone
 
Visibility Optimization for Games
Visibility Optimization for GamesVisibility Optimization for Games
Visibility Optimization for GamesUmbra
 
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)Johan Andersson
 

Mais procurados (20)

Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)Crysis Next-Gen Effects (GDC 2008)
Crysis Next-Gen Effects (GDC 2008)
 
High Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in FrostbiteHigh Dynamic Range color grading and display in Frostbite
High Dynamic Range color grading and display in Frostbite
 
Decima Engine: Visibility in Horizon Zero Dawn
Decima Engine: Visibility in Horizon Zero DawnDecima Engine: Visibility in Horizon Zero Dawn
Decima Engine: Visibility in Horizon Zero Dawn
 
Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3Practical Occlusion Culling in Killzone 3
Practical Occlusion Culling in Killzone 3
 
Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)
 
Rendering AAA-Quality Characters of Project A1
Rendering AAA-Quality Characters of Project A1Rendering AAA-Quality Characters of Project A1
Rendering AAA-Quality Characters of Project A1
 
Hierachical z Map Occlusion Culling
Hierachical z Map Occlusion CullingHierachical z Map Occlusion Culling
Hierachical z Map Occlusion Culling
 
Lighting the City of Glass
Lighting the City of GlassLighting the City of Glass
Lighting the City of Glass
 
Progressive Lightmapper: An Introduction to Lightmapping in Unity
Progressive Lightmapper: An Introduction to Lightmapping in UnityProgressive Lightmapper: An Introduction to Lightmapping in Unity
Progressive Lightmapper: An Introduction to Lightmapping in Unity
 
Secrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics TechnologySecrets of CryENGINE 3 Graphics Technology
Secrets of CryENGINE 3 Graphics Technology
 
Light prepass
Light prepassLight prepass
Light prepass
 
Terrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable SystemTerrain in Battlefield 3: A Modern, Complete and Scalable System
Terrain in Battlefield 3: A Modern, Complete and Scalable System
 
Deferred Lighting and Post Processing on PLAYSTATION®3
Deferred Lighting and Post Processing on PLAYSTATION®3Deferred Lighting and Post Processing on PLAYSTATION®3
Deferred Lighting and Post Processing on PLAYSTATION®3
 
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
Frostbite Rendering Architecture and Real-time Procedural Shading & Texturing...
 
Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1
Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1
Unreal Summit 2016 Seoul Lighting the Planetary World of Project A1
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2
 
Screen Space Reflections in The Surge
Screen Space Reflections in The SurgeScreen Space Reflections in The Surge
Screen Space Reflections in The Surge
 
Visibility Optimization for Games
Visibility Optimization for GamesVisibility Optimization for Games
Visibility Optimization for Games
 
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
Terrain Rendering in Frostbite using Procedural Shader Splatting (Siggraph 2007)
 
The Unique Lighting of Mirror's Edge
The Unique Lighting of Mirror's EdgeThe Unique Lighting of Mirror's Edge
The Unique Lighting of Mirror's Edge
 

Destaque

Killzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemKillzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemGuerrilla
 
Taking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationTaking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationGuerrilla
 
Out of Sight, Out of Mind: Improving Visualization of AI Info
Out of Sight, Out of Mind: Improving Visualization of AI InfoOut of Sight, Out of Mind: Improving Visualization of AI Info
Out of Sight, Out of Mind: Improving Visualization of AI InfoGuerrilla
 
Building Non-Linear Narratives in Horizon Zero Dawn
Building Non-Linear Narratives in Horizon Zero DawnBuilding Non-Linear Narratives in Horizon Zero Dawn
Building Non-Linear Narratives in Horizon Zero DawnGuerrilla
 
Release This! Tools for a Smooth Release Cycle
Release This! Tools for a Smooth Release CycleRelease This! Tools for a Smooth Release Cycle
Release This! Tools for a Smooth Release CycleGuerrilla
 
The Next-Gen Dynamic Sound System of Killzone Shadow Fall
The Next-Gen Dynamic Sound System of Killzone Shadow FallThe Next-Gen Dynamic Sound System of Killzone Shadow Fall
The Next-Gen Dynamic Sound System of Killzone Shadow FallGuerrilla
 
Killzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of GamesKillzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of GamesGuerrilla
 
Killzone 2 Multiplayer Bots
Killzone 2 Multiplayer BotsKillzone 2 Multiplayer Bots
Killzone 2 Multiplayer BotsGuerrilla
 
Deferred Rendering in Killzone 2
Deferred Rendering in Killzone 2Deferred Rendering in Killzone 2
Deferred Rendering in Killzone 2Guerrilla
 
Lighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow FallLighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow FallGuerrilla
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnGuerrilla
 
Automatic Annotations in Killzone 3 and Beyond
Automatic Annotations in Killzone 3 and BeyondAutomatic Annotations in Killzone 3 and Beyond
Automatic Annotations in Killzone 3 and BeyondGuerrilla
 
Killzone's AI: Dynamic Procedural Tactics
Killzone's AI: Dynamic Procedural TacticsKillzone's AI: Dynamic Procedural Tactics
Killzone's AI: Dynamic Procedural TacticsGuerrilla
 
The Real-time Volumetric Cloudscapes of Horizon Zero Dawn
The Real-time Volumetric Cloudscapes of Horizon Zero DawnThe Real-time Volumetric Cloudscapes of Horizon Zero Dawn
The Real-time Volumetric Cloudscapes of Horizon Zero DawnGuerrilla
 
The PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case Study
The PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case StudyThe PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case Study
The PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case StudyGuerrilla
 
Siggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan WakeSiggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan WakeUmbra
 
The Creation of Killzone 3
The Creation of Killzone 3The Creation of Killzone 3
The Creation of Killzone 3Guerrilla
 
Collision Detection an Overview
Collision Detection an OverviewCollision Detection an Overview
Collision Detection an Overviewslantsixgames
 
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Mikhail Kurnosov
 
Moving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingMoving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingElectronic Arts / DICE
 

Destaque (20)

Killzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemKillzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo Postmortem
 
Taking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationTaking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next Generation
 
Out of Sight, Out of Mind: Improving Visualization of AI Info
Out of Sight, Out of Mind: Improving Visualization of AI InfoOut of Sight, Out of Mind: Improving Visualization of AI Info
Out of Sight, Out of Mind: Improving Visualization of AI Info
 
Building Non-Linear Narratives in Horizon Zero Dawn
Building Non-Linear Narratives in Horizon Zero DawnBuilding Non-Linear Narratives in Horizon Zero Dawn
Building Non-Linear Narratives in Horizon Zero Dawn
 
Release This! Tools for a Smooth Release Cycle
Release This! Tools for a Smooth Release CycleRelease This! Tools for a Smooth Release Cycle
Release This! Tools for a Smooth Release Cycle
 
The Next-Gen Dynamic Sound System of Killzone Shadow Fall
The Next-Gen Dynamic Sound System of Killzone Shadow FallThe Next-Gen Dynamic Sound System of Killzone Shadow Fall
The Next-Gen Dynamic Sound System of Killzone Shadow Fall
 
Killzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of GamesKillzone Shadow Fall: Creating Art Tools For A New Generation Of Games
Killzone Shadow Fall: Creating Art Tools For A New Generation Of Games
 
Killzone 2 Multiplayer Bots
Killzone 2 Multiplayer BotsKillzone 2 Multiplayer Bots
Killzone 2 Multiplayer Bots
 
Deferred Rendering in Killzone 2
Deferred Rendering in Killzone 2Deferred Rendering in Killzone 2
Deferred Rendering in Killzone 2
 
Lighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow FallLighting of Killzone: Shadow Fall
Lighting of Killzone: Shadow Fall
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
 
Automatic Annotations in Killzone 3 and Beyond
Automatic Annotations in Killzone 3 and BeyondAutomatic Annotations in Killzone 3 and Beyond
Automatic Annotations in Killzone 3 and Beyond
 
Killzone's AI: Dynamic Procedural Tactics
Killzone's AI: Dynamic Procedural TacticsKillzone's AI: Dynamic Procedural Tactics
Killzone's AI: Dynamic Procedural Tactics
 
The Real-time Volumetric Cloudscapes of Horizon Zero Dawn
The Real-time Volumetric Cloudscapes of Horizon Zero DawnThe Real-time Volumetric Cloudscapes of Horizon Zero Dawn
The Real-time Volumetric Cloudscapes of Horizon Zero Dawn
 
The PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case Study
The PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case StudyThe PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case Study
The PlayStation®3’s SPUs in the Real World: A KILLZONE 2 Case Study
 
Siggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan WakeSiggraph 2011: Occlusion culling in Alan Wake
Siggraph 2011: Occlusion culling in Alan Wake
 
The Creation of Killzone 3
The Creation of Killzone 3The Creation of Killzone 3
The Creation of Killzone 3
 
Collision Detection an Overview
Collision Detection an OverviewCollision Detection an Overview
Collision Detection an Overview
 
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 10: Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
Moving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based RenderingMoving Frostbite to Physically Based Rendering
Moving Frostbite to Physically Based Rendering
 

Mais de Guerrilla

Horizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case StudyHorizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case StudyGuerrilla
 
Horizon Zero Dawn: A Game Design Post-Mortem
Horizon Zero Dawn: A Game Design Post-MortemHorizon Zero Dawn: A Game Design Post-Mortem
Horizon Zero Dawn: A Game Design Post-MortemGuerrilla
 
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero DawnPutting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero DawnGuerrilla
 
The Production and Visual FX of Killzone Shadow Fall
The Production and Visual FX of Killzone Shadow FallThe Production and Visual FX of Killzone Shadow Fall
The Production and Visual FX of Killzone Shadow FallGuerrilla
 
A Hierarchically-Layered Multiplayer Bot System for a First-Person Shooter
A Hierarchically-Layered Multiplayer Bot System for a First-Person ShooterA Hierarchically-Layered Multiplayer Bot System for a First-Person Shooter
A Hierarchically-Layered Multiplayer Bot System for a First-Person ShooterGuerrilla
 
The Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeThe Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeGuerrilla
 

Mais de Guerrilla (6)

Horizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case StudyHorizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case Study
 
Horizon Zero Dawn: A Game Design Post-Mortem
Horizon Zero Dawn: A Game Design Post-MortemHorizon Zero Dawn: A Game Design Post-Mortem
Horizon Zero Dawn: A Game Design Post-Mortem
 
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero DawnPutting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
Putting the AI Back Into Air: Navigating the Air Space of Horizon Zero Dawn
 
The Production and Visual FX of Killzone Shadow Fall
The Production and Visual FX of Killzone Shadow FallThe Production and Visual FX of Killzone Shadow Fall
The Production and Visual FX of Killzone Shadow Fall
 
A Hierarchically-Layered Multiplayer Bot System for a First-Person Shooter
A Hierarchically-Layered Multiplayer Bot System for a First-Person ShooterA Hierarchically-Layered Multiplayer Bot System for a First-Person Shooter
A Hierarchically-Layered Multiplayer Bot System for a First-Person Shooter
 
The Guerrilla Guide to Game Code
The Guerrilla Guide to Game CodeThe Guerrilla Guide to Game Code
The Guerrilla Guide to Game Code
 

Último

Call Girls Agency In Goa 💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...
Call Girls  Agency In Goa  💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...Call Girls  Agency In Goa  💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...
Call Girls Agency In Goa 💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...russian goa call girl and escorts service
 
(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...ranjana rawat
 
Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...
Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...
Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...noor ahmed
 
↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...
↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...
↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...noor ahmed
 
Beautiful 😋 Call girls in Lahore 03210033448
Beautiful 😋 Call girls in Lahore 03210033448Beautiful 😋 Call girls in Lahore 03210033448
Beautiful 😋 Call girls in Lahore 03210033448ont65320
 
VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...
VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...
VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...anamikaraghav4
 
👙 Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Service
👙  Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Service👙  Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Service
👙 Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Serviceanamikaraghav4
 
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...Apsara Of India
 
2k Shot Call girls Laxmi Nagar Delhi 9205541914
2k Shot Call girls Laxmi Nagar Delhi 92055419142k Shot Call girls Laxmi Nagar Delhi 9205541914
2k Shot Call girls Laxmi Nagar Delhi 9205541914Delhi Call girls
 
Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...
Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...
Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...ritikasharma
 
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...noor ahmed
 
Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...
Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...
Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...Riya Pathan
 
Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...
Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...
Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...Apsara Of India
 
(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...
(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...
(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...ranjana rawat
 
Call Girl Nagpur Roshni Call 7001035870 Meet With Nagpur Escorts
Call Girl Nagpur Roshni Call 7001035870 Meet With Nagpur EscortsCall Girl Nagpur Roshni Call 7001035870 Meet With Nagpur Escorts
Call Girl Nagpur Roshni Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130
VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130
VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130Suhani Kapoor
 

Último (20)

Call Girls Agency In Goa 💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...
Call Girls  Agency In Goa  💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...Call Girls  Agency In Goa  💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...
Call Girls Agency In Goa 💚 9316020077 💚 Call Girl Goa By Russian Call Girl ...
 
(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
(DIVYA) Dhanori Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Esc...
 
Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...
Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...
Book Paid Sonagachi Call Girls Kolkata 𖠋 8250192130 𖠋Low Budget Full Independ...
 
↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...
↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...
↑Top Model (Kolkata) Call Girls Salt Lake ⟟ 8250192130 ⟟ High Class Call Girl...
 
Beautiful 😋 Call girls in Lahore 03210033448
Beautiful 😋 Call girls in Lahore 03210033448Beautiful 😋 Call girls in Lahore 03210033448
Beautiful 😋 Call girls in Lahore 03210033448
 
VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...
VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...
VIP Call Girls Sonagachi - 8250192130 Escorts Service 50% Off with Cash ON De...
 
👙 Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Service
👙  Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Service👙  Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Service
👙 Kolkata Call Girls Shyam Bazar 💫💫7001035870 Model escorts Service
 
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
Karnal Call Girls 8860008073 Dyal Singh Colony Call Girls Service in Karnal E...
 
Call Girls New Ashok Nagar Delhi WhatsApp Number 9711199171
Call Girls New Ashok Nagar Delhi WhatsApp Number 9711199171Call Girls New Ashok Nagar Delhi WhatsApp Number 9711199171
Call Girls New Ashok Nagar Delhi WhatsApp Number 9711199171
 
2k Shot Call girls Laxmi Nagar Delhi 9205541914
2k Shot Call girls Laxmi Nagar Delhi 92055419142k Shot Call girls Laxmi Nagar Delhi 9205541914
2k Shot Call girls Laxmi Nagar Delhi 9205541914
 
Call Girls South Avenue Delhi WhatsApp Number 9711199171
Call Girls South Avenue Delhi WhatsApp Number 9711199171Call Girls South Avenue Delhi WhatsApp Number 9711199171
Call Girls South Avenue Delhi WhatsApp Number 9711199171
 
Goa Call "Girls Service 9316020077 Call "Girls in Goa
Goa Call "Girls  Service   9316020077 Call "Girls in GoaGoa Call "Girls  Service   9316020077 Call "Girls in Goa
Goa Call "Girls Service 9316020077 Call "Girls in Goa
 
Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...
Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...
Behala ( Call Girls ) Kolkata ✔ 6297143586 ✔ Hot Model With Sexy Bhabi Ready ...
 
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
↑Top Model (Kolkata) Call Girls Howrah ⟟ 8250192130 ⟟ High Class Call Girl In...
 
Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...
Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...
Independent Hatiara Escorts ✔ 8250192130 ✔ Full Night With Room Online Bookin...
 
Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...
Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...
Contact:- 8860008073 Call Girls in Karnal Escort Service Available at Afforda...
 
(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...
(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...
(KRITI) Pimpri Chinchwad Call Girls Just Call 7001035870 [ Cash on Delivery ]...
 
Call Girl Nagpur Roshni Call 7001035870 Meet With Nagpur Escorts
Call Girl Nagpur Roshni Call 7001035870 Meet With Nagpur EscortsCall Girl Nagpur Roshni Call 7001035870 Meet With Nagpur Escorts
Call Girl Nagpur Roshni Call 7001035870 Meet With Nagpur Escorts
 
CHEAP Call Girls in Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in  Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in  Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Malviya Nagar, (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130
VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130
VIP Call Girls Service Banjara Hills Hyderabad Call +91-8250192130
 

Practical Occlusion Culling on PS3

  • 1.
  • 3. Freelancer with graphics tech bias  Working with Guerrilla since 2005  Talking about occlusion culling in KILLZONE 3
  • 4. Background: Why do occlusion culling?  The SPU runtime (rendering and testing)  Creating workable occluders  Useful debugging tools  Problems and performance  Results, and thoughts on where to go next
  • 5. Drawing these guys is a waste of time
  • 6. Scene geometry in a Kd-Tree  Culled using zones, portals and blockers  Problems:  Lots of artist time to place and tweak  Entirely static  Geometric complexity  Lots of tests, fiddly code  Too much time – around 10-30% of one SPU (serial)  Can't feed RSX until it's done
  • 7.
  • 8. PPU Other work Prepare to draw Kick Other work SPU Other work Scene query Build main display list Other rendering SPU Other work Other rendering SPU Other work Other rendering SPU Other work Other rendering SPU Other work Other rendering
  • 9. PPU Prepare to draw Kick SPU Scene query Build main display list Scene Query database result Kd-Tree Objects Main Zones Parts memory Portals Lights
  • 10.
  • 11.
  • 12.
  • 13. Increase scene complexity  Larger, more open environments  With more stuff in them  Simplify content pipeline  Don't waste artist time on things which aren't pretty  Don't require artist tweaks – but allow them  80% solution  Want it to “just work” 80% of the time
  • 14. Don't increase RSX load  Never enough GPU time that we can waste it  Fully conservative solution  No popping when you go around corners  Drop into pipeline without restructuring  Reduce risk  Allow swapping between implementations at runtime
  • 15. Some spare memory  Some spare SPU time  Best guess: create and test a depth buffer on SPUs  Decouples tests and occluders  Rendering linear in number of occluders  Testing linear in number of objects  Plays to SPU strengths  Culls early
  • 16. Create occluder geometry offline  Each frame, SPUs render occluders to 720p depth buffer  Split buffer into 16 pixel high slices for rasterisation  Down-sample buffer to 80x45 (16x16 max filter)  Test bounding boxes against this during scene traversal  Accurate: Rasterisation + depth test  Coarse: Some kind of constant-time point test
  • 17.
  • 18. PPU … Other work SPU … Scene query Setup Rasterise Filter Occluded query Build main display list ... SP Other work Rasterise Other Occluded Other rendering work query U SP Other work Rasterise Other Occluded Other rendering work query U SP Other work Rasterise Other Occluded Other rendering work query U SP Other work Rasterise Other Occluded Other rendering work query U
  • 19. PPU … SPU Scene query Setup Rasterise Filter Occluded query Build main display list Scene Query Staging Occlusion Query database result area buffer result Main Kd-Tree Occluder Projected Depth data Objects meshes occluder Parts memory triangles Lights
  • 20. s ld Block Size Count Total Global triangles 48 bytes 4096 192KB DMA list entries 8 bytes 23K 184KB Job commands 3KB Grand total 379KB  NB:  We originally rasterised at 720p  Ended up shipping with 640x360 (see later)  Memory and performance figures are for this option
  • 21. Finds occluders in the (truncated) view frustum  Occluders are normal rendering primitives  Live with the rest of a drawable object, identified by flag bit Extract Sort Walk Kd- Output Query tree occluder parts occluders by size list Main Mesh Query Kd-tree memory data result
  • 22. Decodes RSX-style vertex and index arrays  Outputs clipped + projected triangles to staging area  Internal pipeline to hide DMA latency Resolve indirection in engine data Workload Load Load Load Prime Prime Process Setup address part arrays indices vertices (global write (local copy) (local copy) (local copy) (1K cache) (2k cache) caches) Main Query Engine Array Index Vertex Staging memory result structs headers array array area
  • 23. Block Size Count Total Triangle write cache 6KB 1 6KB DMA list write cache 1.5KB 23 34.5KB Index cache 1KB 6 6KB Vertex data cache 2KB 6 12KB Post-transform cache ~600b 6 ~3.5KB Smaller data, alignment slop etc. 11KB Total data 73KB Stack 8KB Code 40KB Grand total 105KB
  • 24. First three stages load small (bytes rather than KB) engine structs  Index data streamed through 1K cache  First read pipelined, later reads block  Occluders diced so they usually fit in one go  Vertex data streamed through 2K cache  First read pipelined again  90% hit rate  32-entry post-transform cache  Direct mapped, not a FIFO  60% hit rate
  • 25. Last stage does all the heavy lifting  Decode vertices from 32-bit float or 16-bit integer  RSX formats  No-clipping path  Primitive bounds lie inside frustum  Store projected vertices in post-transform cache  Clipping path  Only when required  Cull/clip triangles against near and far planes  „Scissor‟ test handles image extents later  Store clip-space vertices in post-transform cache  Branchless clipper
  • 26. Cull projected triangles against image extents  Send visible triangles to staging area in main memory  Store one copy of each triangle  via 6KB double-buffered write cache  Store DMA list entry for each strip under the triangle  via 1.5KB double-buffered write cache  Saves memory (8 byte entries vs. 48-byte triangles)  If we run out of staging space, ignore excess triangles  Then setup and kick rasteriser jobs
  • 27. Launch one rasterise job per strip  Load triangles from staging area using list DMA  Draw triangles to a floating point 640x16 depth buffer in LS  Compress depth buffer to uint16 and store Setup and Compress List DMA Output Rasterise input draw depth scanline triangles buffer Main Staging Occlusion memory area buffer
  • 28. Block Size Count Total Input triangle buffer 48KB 1 48KB Depth buffer 20KB 1 20KB Output scanline <1KB 1 <1KB Smaller data, alignment slop etc. ~1KB Total data 70KB Stack 8KB Code 11KB Grand total 89KB
  • 29. Traditional scanline rasterisation p2 p1  Paid attention to triangle setup speed  Also considered half spaces p1‟ y=0  Not tried this yet though  Handle four edges at once (SoA)  Sort edges start and end on Y  Using shuffle table  Clip edges to strip p1 p2  Walk edges and write X, Z pairs into 16- entry span table y=15
  • 30. Outer loop over span table  C-with-intrinsics  Inner loop along scanline y=0  SPA assembler  4-pixel-wide SIMD  Interpolate depth values  Depth test and write if nearer  Mask writes at start and end y=15
  • 31. Down-sample each 16x16 tile to 1 depth value  Take maximum so depth is conservative  Encode depth values as unsigned short  Scale float value such that the far plane is at 0xfffe  Take the ceiling of the scaled value  Reserve 0xffff for infinity  Occlusion frustum is much less deep than view frustum  Each rasterise job produces one row of the occlusion buffer (one tile high)  DMA row back to main memory  Full-size image never really exists  Last job out kicks the filter job  Synchronise with simple semaphore
  • 32. Actually we cheat a bit   Take 2x2 minimum before 16x16 maximum down-sample  Patches holes cheaply – input isn't perfect  Otherwise a single pixel hole becomes an entire tile! I SEE YOU!
  • 33. Runs after rasterisation is complete  Generates coarse reject data  Used during query to cull small objects  Writes back to reject buffer (contiguous with occlusion buffer) Read Generate Filter depth reject data Write back values Main Occlusion Reject memory buffer buffer
  • 34. Tests work in a two-level hierarchy  Objects live in the Kd-tree, and contain multiple parts  Test objects to avoid extracting parts  Test parts to avoid drawing them  Final query result written to main memory and used to build display list Write Walk Test Extract Test Query++ Kd-tree objects parts parts visible parts Main Kd-tree Query Mesh data memory data result
  • 35. Rasterise front-facing quads of bounding box  At resolution of occlusion buffer (40x23)  Early out and return visible as soon as a scan-line passes depth test  Same code as occluders, smaller buffer  Small quad optimisations important  Native quad support avoids setting up two triangles  Relatively expensive  Rasterisation is costly  Times 500-1500 objects with 2000-4000 parts
  • 36. Use extra levels of reject data  Same size as top level  Conservatively re-sampled  Test bounding spheres against this buffer if they are small enough  Fall back to raster test if a given object or part is too large  Much cheaper  Constant time tests  But limited  Only support spheres of certain radii  Large radius: more sphere tests, but more false positives  Small radius: more raster tests, but fewer false positives
  • 37. Sample occlusion frame  Transform 100 occluders  With 1500 global triangles (2200 across strips)  Fill 500K pixels @ 640x360  Test 1000 objects  Test 2700 parts  Timings  Setup job: 0.5ms  Rasterise job: 2.0ms (on 5 SPUs)  Query job: 4.5ms (on 5 SPUs) with 1.0ms doing occlusion queries  Overall latency: ~2ms
  • 38. Intended to build occluders from existing visual meshes  Avoid creating too much data  Use same vertex buffer with new index buffer  QEMM-simplified or some other method of reduction  Easy to get started with test data  Just render everything  We used this for initial runtime development
  • 39.
  • 40. Problems with this approach  Far too much data  Hard to reduce without losing silhouette  Not closed  Holes in the occlusion buffer  Even worse with back-face culling  Needed something better  Turned out we already had a good candidate
  • 41.
  • 42. Good properties:  Closed  Simple  Somewhat accurate  We have to be able to shoot it  Not really accurate enough  Didn't realise this until quite late  Still way too much of it  Small occluders  Holey occluders
  • 43. Good Bad
  • 44. Filter based on content meta-data  Walls, floors, ceilings, terrain = good  Set dressing, props, clutter = bad  Filter based on geometry  Don't create really small occluders at all  Compare total area of triangles against surface area of bounds  Throw away anything below a given threshold  Actually use several thresholds, based on size  Gives us reasonable starting point
  • 45. Needed the human touch to get the best out of the system  Tagging  Never, Always, or Auto (in which case let heuristics decide)  Custom occluders  Artists can provide their own meshes  Give these priority at runtime during sort  Often just 2-sided quads, or boxes  Cheap to author, cheap to render
  • 46.
  • 47.
  • 48. Testing a system like this is hard  If you did a good job…  …then there are no visible results   Makes it hard to prove you‟ve done any work…
  • 49. Three main modes  Common display:  Occlusion buffer  Timings, stats, warnings  Can take screen shot of occlusion buffer  For debugging the rasteriser
  • 50. Lit depth-tested translucent geometry  Cheap, since we're rendering from hardware-style vertex and index buffers.  Colour coding  Important/custom  Active/inactive  Overflows  Important mode for artists  Did my custom occluder work?
  • 51.
  • 52.
  • 53.
  • 54. Draw bounding boxes when objects are culled out  Drawing the not-drawn stuff  Colour coded by type  Objects, parts, lights, etc.  Good for demos  “Wow, look at all that stuff I can't see!”  And rough performance tuning
  • 55.
  • 56.
  • 57. Draw the occlusion buffer tiles on the screen  Transparency-coded for depth  Good for checking conservatism is working right  Also used by artists when checking for occlusion leaks
  • 58.
  • 59.
  • 60.
  • 61. Existing scene debug tool  Uses player camera for the frustum  But debug camera for the renderer  Very useful for testing culling  Frustum and occlusion  All games should have this!
  • 62.
  • 63.
  • 64.
  • 65. Might get fired here…
  • 66. Initially tried a bit too hard to get good SPU performance  Used sphere tests only for some situations  So we didn‟t get enough RSX culling  Had to make sure we do full tests on all objects  Makes optimisation even more important
  • 67. Rasterisation and testing too expensive  Both largely bound by fill rate  Already worked on triangle setup  720p occlusion buffer was a headache…  But it did provide a lot of headroom:  Downsize to 360p – 40x23 tiles rather than 80x45  Instant fourfold speedup!  Possible artifacts  Already have 2 pixel artifacts from gap removal – this makes them 4 pixel  Still quite small   Checked it in quietly…
  • 68. Other significant optimisations  Temporal coherence  Assume an object is visible if it was last frame  Use feedback from testing parts to update status  Split query job into serial and parallel parts  Serial: Walk Kd-Tree and generate object list  Parallel: Test objects and extract parts  Sub-mesh culling  Use spatial Kd-Tree inside a mesh to cull it in arbitrarily small pieces  Keep slicing and testing until we get to the break-even point
  • 69. We had some specific problems with skinny objects  Radius too large for sphere tests  Not enough pixels generated during raster tests for reliable result  Didn‟t want to use conservative rasterisation  Too risky too late  Would have made all objects bigger, but we had only a few problem objects  Test a diagonal of each quad  If the diagonal is visible, the quad is visible  If not, test the quad  Fixed the skinny objects, plus it saved some time overall
  • 70.
  • 71. Code production costs  Two man-months to get initial implementation running  One month to switch to physics meshes and make everything robust for production  Two months bug fixing and optimisation  Runtime costs  ~400KB scratch memory per view  20-50% of one SPU (for everything)
  • 72. Pros  Relatively fast, with room to optimise further  Stable and predictable performance  Completely dynamic  Excellent occluder fusion  Cons  Still needed artist work to get levels running fast enough  But easier to do than with old system  Campaign levels: 5-10% of occluders custom made  Multi player levels: 20-50% of occluders custom made   Should have anticipated this earlier and changed workflow to suit
  • 73. will@secondintention.com  Slides will be in the GDC Vault  Also on http://www.secondintention.com/
  • 74. Thanks for listening!  Thanks to everyone at Guerrilla for being awesome!  Special thanks to Incognito for their sample code
  • 75. Tame software rasteriser = opportunity  Rendering AI depth cubemaps  Combined with caching and offline generation  Use idle time  Reasoning in dynamic worlds!  Experiments are promising...  Rendering sun occlusion  For really cool glares  Use idle time  Like the speeder bike sequence in Jedi
  • 76. Reduce the number of tests  CHC – Wimmer + Bittner – GPU gems 2 Ch. 6  Much easier without the GPU involved  Visible last frame?  Assume visible this frame, and skip the test  Update assumption based on low level tests  Usually use GPU feedback for this  We use feedback from part tests instead
  • 77. Parallelise scenegraph job  Kd-Tree part is fast but complicated – serial  Extracting parts from objects is slow but dumb – parallel  Works really well  Same IO as usual  Output into array without locks using atomic reservations  Lots more space in LS for each job  Bigger caches
  • 78. Job code starts as C/C++  Optimise when we have real data  Structural code stays C/C++  Lots of C style  Mix in intrinsics where necessary  To get SIMD  To get to instruction set  Can be 10x faster  SPA for inner loops  2x faster again

Notas do Editor

  1. We want to draw as much stuff as possible.If we spend time drawing anything invisible, we waste time on the RSX and in our pipeline.
  2. Zones connected with portals, blockers can occlude portal frustums.
  3. Now to get into what we actually built. I’m going to cover rasterisation first, then the tests - since that’s the order we worked in.
  4. It’s worth having a quick look at what we write to the scratch area of main memory. The setup job writes triangle data, but because triangles often span multiple strips we only store the triangle once (48 bytes) and then store an DMA list entry (8 bytes) for each strip the triangle touches.We also have space for a couple of KB of job commands in the scratch area, for when the setup job launches the rasterise jobs.
  5. In future we’ll probablyincrease some cache sizes and optimise this job further, but it didn’t become a bottleneck until we’d worked on speeding up a lot of other areas. The split sizes show different configurations for full-720p vs. half-720p depth buffers.
  6. In future we’ll probablyincrease some cache sizes and optimise this job further, but it didn’t become a bottleneck until we’d worked on speeding up a lot of other areas. The split sizes show different configurations for full-720p vs. half-720p depth buffers.
  7. Got started with some reference code from IncognitoHalf-space rasterisation might not be worth it since we are only interested in one interpolated attribute.Also might not be worth it since our “tiles” are wide rather than squareTriangle setup speed matters! Use SoA and process 3 (or 4) edges at once.One of our occlusion tests is to rasterise a primitive’s bounding box and depth-test it against the occlusion buffer, which means drawing small triangles. It’s also the reason we support quads directly – it reduces the setup cost for bounding box faces.
  8. Once the system was in full production use and we saw how much content was going into the levels, we realised we had some problems:We were spending too much time in the occlusion code, both testing and rasterisation.We weren’t always culling enough geometry, meaning the RSX still had too much work to do.