Difference between revisions of "Partial scene baking"
(→The sector system) |
|||
(7 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | In the level design process, especially when working on very large maps, it is often desirable to only rebake a small chunk of the world and iterate on it. Originally Bakery's [[Manual#Bakery_Lightmap_Group_Selector|Lightmap Groups]] were meant to achieve it (apart from their other benefits). In practice, however, it didn't work well, as they are limited to a single lightmap atlas, and "Render Selected" functionality had too many constraints due to lightmapper's core architecture. "Render Selected" also didn't reduce the memory footprint of world geometry; all vertices and triangles of all loaded scenes had to be ready in VRAM. | + | In the level design process, especially when working on very large maps, it is often desirable to only rebake a small chunk of the world and iterate on it. Originally Bakery's [[Manual#Bakery_Lightmap_Group_Selector|Lightmap Groups]] were meant to achieve it (apart from their other benefits). In practice, however, it didn't work well, as they are limited to a single lightmap atlas, and "Render Selected Groups" functionality had too many constraints due to lightmapper's core architecture. "Render Selected Groups" also didn't reduce the memory footprint of world geometry; all vertices and triangles of all loaded scenes had to be ready in VRAM. |
Large scenes could be also split into multiple smaller scenes, but this approach required more setup and, most importantly, such scenes couldn't light/shadow each other. | Large scenes could be also split into multiple smaller scenes, but this approach required more setup and, most importantly, such scenes couldn't light/shadow each other. | ||
Line 5: | Line 5: | ||
== The sector system == | == The sector system == | ||
[[File:Bsector.jpg|thumb|BakerySector component UI]] | [[File:Bsector.jpg|thumb|BakerySector component UI]] | ||
− | The | + | The sector system (added in v1.9) attempts to solve this problem. |
'''BakerySector''' is a collection of objects that can be baked separately. Similar to Lightmap Groups, adding BakerySector component to a root object of a hierarchy, marks all objects in this hierarchy as belonging to this sector. | '''BakerySector''' is a collection of objects that can be baked separately. Similar to Lightmap Groups, adding BakerySector component to a root object of a hierarchy, marks all objects in this hierarchy as belonging to this sector. | ||
Line 104: | Line 104: | ||
=== Light probes and volumes === | === Light probes and volumes === | ||
− | * | + | * Since v1.96, light probes can be partially baked inside sectors, if "Bake Light Probes" checkbox is set on the Sector. Light Probe Groups must be in the hierarchy of the root Sector object. |
* Volumes from the hierarchy of the chosen sector are baked; other volumes are left unchanged. | * Volumes from the hierarchy of the chosen sector are baked; other volumes are left unchanged. | ||
+ | |||
+ | <hr> | ||
+ | |||
+ | === Material compatibility === | ||
+ | |||
+ | Internally, capture points render the scene in 6 directions using special shaders that output albedo, normal and depth. | ||
+ | As these shaders don't have original shaders' logic, procedural albedos may be lost. Currently every rendered object will draw _MainTex/_BaseMap/_BaseColorMap of the material (whichever is present). As capture points draw objects directly as seen (with perspective projection), they can't, unlike the lightmapper or the RTPreview, use the [https://docs.unity3d.com/Manual/MetaPass.html Meta Pass]. |
Latest revision as of 16:29, 14 November 2024
In the level design process, especially when working on very large maps, it is often desirable to only rebake a small chunk of the world and iterate on it. Originally Bakery's Lightmap Groups were meant to achieve it (apart from their other benefits). In practice, however, it didn't work well, as they are limited to a single lightmap atlas, and "Render Selected Groups" functionality had too many constraints due to lightmapper's core architecture. "Render Selected Groups" also didn't reduce the memory footprint of world geometry; all vertices and triangles of all loaded scenes had to be ready in VRAM.
Large scenes could be also split into multiple smaller scenes, but this approach required more setup and, most importantly, such scenes couldn't light/shadow each other.
Contents
The sector system
The sector system (added in v1.9) attempts to solve this problem. BakerySector is a collection of objects that can be baked separately. Similar to Lightmap Groups, adding BakerySector component to a root object of a hierarchy, marks all objects in this hierarchy as belonging to this sector.
Main Bakery window (when viewed in Advanced/Experimental mode) now has a sector field:
If not set, all bakes will proceed normally; but if set to a specific sector, only this sector will be baked, or rendered in RTPreview.
Here is an example. Two white boxes belong to a sector. First, this is how it looks in RTPreview (and for the lightmapper) by default:
All scene objects are present and will be fully baked.
Now, with the sector selected:
Only white boxes are visible by the lightmapper now. They can be baked separately without breaking existing scene lightmaps. However, they lack shadows and bounces from the surrounding geometry.
To fix this problem, BakerySector has Capture Points. Each capture point is like a virtual omnidirectional camera (or a cubemap, if it's easier to grasp). These points capture the scene around them (depth and albedo information) and generate a simplified projected mesh. Multiple capture points can be combined to cover different viewpoints, acting similarly to a virtual version of 3D scanning. When the real scene is very large and complex, these projected meshes can work as its cheap approximation, providing desired shadows/bounces, while only requiring a fraction of memory/time to process. Projected geometry is temporary and only used in the bake/preview; it won't persist in the scene.
Here is the same scene in RTPreview, with 1 capture point added:
Now shadows and bounces on the white boxes look just as if we had whole world geometry loaded; but instead of the real geometry, only this projected mesh is used.
Adding another capture point recovers more of the outside geometry:
Real world example
In the toy example above there is no real benefit of using sectors. But here is a real example:
There is a large city map. A new chunk, containing roads, buildings and various props was added. Baking the whole map at once is not possible in this case; it just won't fit in memory. It can be done with an upgraded GPU, but then it would still take too long.
We really just want to bake this new chunk and make it look integrated into the world:
A sector is added to the root object of the chunk. We can now bake the chunk separately, and it will bake pretty fast:
And now with a bunch of capture points:
The new chunk can be now baked quickly, while receiving shadows and GI from the surrounding world and without breaking older bakes.
Loading, saving and reusing captures
BakerySector has multiple modes of operation. The default Capture In Place mode generates projected geometry each time the Render or "Open preview" buttons are pressed. This geometry is based on what is currently visible in the opened scenes.
Alternatively, projected geometry can be saved into an asset and then loaded anywhere, even in a different scene. This is especially useful when iterating on interiors.
Suppose there is a large city scene and a detailed interior inside it. The interior is in a separate scene, so it's easier to work on it, but we still want city shadows/bounces to affect the interior through windows.
A sector can be added to the root of the room, and capture points can be placed just outside the windows:
You can then copy the sector object (without any geometry itself) to the city scene, set mode to Capture To Asset and click Capture:
Loading back the room scene, set mode to Load Captured and select the generated asset:
Bakery will now "see" the projected approximation of the city, as seen from capture points, even though the city is not even loaded in the scene:
Loaded sectors can be cloned, moved and rotated. Each copy of the room will still see the same captured city through its windows:
Light probes and volumes
- Since v1.96, light probes can be partially baked inside sectors, if "Bake Light Probes" checkbox is set on the Sector. Light Probe Groups must be in the hierarchy of the root Sector object.
- Volumes from the hierarchy of the chosen sector are baked; other volumes are left unchanged.
Material compatibility
Internally, capture points render the scene in 6 directions using special shaders that output albedo, normal and depth. As these shaders don't have original shaders' logic, procedural albedos may be lost. Currently every rendered object will draw _MainTex/_BaseMap/_BaseColorMap of the material (whichever is present). As capture points draw objects directly as seen (with perspective projection), they can't, unlike the lightmapper or the RTPreview, use the Meta Pass.