Bakery Manual
User Manual:
Open the PDF directly: View PDF .
Page Count: 23
Bakery - GPU Lightmapper
Manual (v1.4)
Why use Bakery
Bakery is designed as an alternative to existing lightmappers and focuses on solving following problems:
- Fixing various baking artifacts, such as seams, light/shadow leaks, incorrect shadow terminators, etc.
Baking a lightmap should not bring more problems than rendering a camera frame in an offline
renderer.
- Baking all kinds of lighting data, not just complete lighting or GI only. As of today, you can ask Bakery
to generate mixed direct and indirect lighting from all supported light sources and their shadow masks.
Lighting can be also baked per-vertex instead of using textures.
- Directional information can be baked in the form of dominant direction map (classic “directional” mode
in Unity), 3 maps for Radiosity Normal Mapping, or 4 maps for per-pixel Spherical Harmonics (much
higher quality than classic directional). Multiple directional modes can be used in a single scene on
different objects.
- Physical correctness. Bakery results were thoroughly compared against Mitsuba, a well-known
unbiased renderer. Unlike Unity’s built-in solutions, Bakery supports correct inverse-squared lighting
attenuation (or if you don’t like it, you can always use Unity-compatible attenuation mode).
-IES light support.
- Render Selected (see details)
- LOD support.
- Baking multiple switchable lightmaps per object is planned.
Quickstart
1. Open Unity, create a new scene and import Bakery (Assets->Import Package->Custom Package).
2. Add some model or primitive and mark it as Static.
3. Select Directional Light (the one Unity created for you) and add Bakery Direct Light component to it.
● Bakery light sources are separate from Unity light sources.
4. Bakery Direct Light has many settings to tweak, but you can easily match it to Unity light. Click Match
lightmapped to real-time. Now Bakery light should have the same yellowish color as Unity’s default
Directional.
● Bakery Direct Light may complain about project not using linear light intensity. The problem is
that by default Unity applies gamma correction to light source colors in a wrong way. Correct
mode can be enabled by scripting, and that’s what the “Fix” button does. If you already have
many light sources set up with incorrect intensity mode, and you don’t want to change them
again, you may skip fixing. Even if you press “Fix”, you can always revert the change anytime.
5. To get shadowed ambient lighting, create Skylight (Bakery->Create->Skylight).
6. Select Skylight, give it some bluish color and click Match scene skybox to this light. This will make
skybox match lighting exactly.
● You can always do it both ways: match skybox to skylight or skylight to skybox.
7. Click Bakery->Render Lightmap. By default, Full Lighting mode is
active. It will bake both direct and indirect contribution from all
lights. If you want to combine real-time shadows with baked GI,
change it to Indirect.
● Bakery may complain that you are using old gamma mode
and suggest to change it. If you care about quality of
lighting, using Linear mode is highly recommended. The
only excuse not to use it is when you already have a big
project set up with incorrect gamma, and you don’t want to
change it.
8. Click Render.
9. Done! You should now have baked GI.
Render settings
All render settings can be accessed via Bakery->Render Lightmap. Settings are saved for every scene. First
option you will see (named Settings) allows to switch between Simple,Advanced and Experimental
settings. Simple is enough for most tasks.
Common settings:
-Render mode: defines what kind of lightmaps to bake.
-Full Lighting will generate complete direct and indirect lighting. If you have both Unity and
Bakery components on the same light, you will need to disable Unity ones to avoid double
brightness.
-Indirect is a basic mixed mode. It will look at the Bake to Indirect checkbox on every light: if
it’s ON, the light is baked as in Full Lighting mode. If it’s OFF, only indirect contribution (GI) from
this light is baked. In the latter case you should keep both Unity and Bakery lights on the object,
one giving real-time direct contribution, and another for precomputed GI. Bake to Indirect is
enabled by default for Skylights and Light Meshes, because Unity can’t reproduce their lighting
in real-time.
-Shadowmask is a more advanced mixed mode. It works by generating 2 types of lightmaps -
one with indirect color (as in Indirect mode, so Bake To Indirect checkboxes still apply), and
another with shadows from static objects. It has several benefits:
- Real-time shadows can render only a handful of dynamic objects, instead of the whole
scene.
- Real-time and baked shadows blend together properly.
- Real-time lights can render bump, specular and other surface effects, while still being
occluded by high-quality baked shadows.
Currently only Direct, Point and Spot lights can interact with shadowmasking (because they are
the only types Unity supports in real-time). To enable this behaviour, you must have both Unity
and Bakery lights on the same object, with Shadowmask checkbox enabled on the latter.
-Distance Shadowmask: this checkbox is only visible if you chose shadowmask and simply
toggles equally named setting in project’s Quality Settings.
● This checkbox doesn’t appear on Unity 5.6.x due to the lack of corresponding scripting
API. Instead you can toggle it in Window->Lighting->Mixed Lighting->Lighting Mode.
Top: Bakery is set to Indirect mode, and the real-time light is enabled. Only GI is baked.
Bottom: Bakery is set to Full mode, and the real-time light is disabled. Both GI and shadows are baked, but
there is no shadow from the dynamic character.
A more complete render mode comparison, now with Shadowmask:
As one can conclude, Distance Shadowmask is the highest quality mode available so far, with the only
problem of unshadowed dynamic objects outside of the dynamic shadow range, while regular Shadowmask
mode also being relatively cheap to render.
Here is also a comparison of different light configurations using Shadowmask mode. Little cubes are static,
while capsules are dynamic:
Left: completely baked light. Center: dynamic light with baked GI. Right: capsule shadow, bump and specular
are dynamic, but cube shadow and GI are baked.
When camera gets far away enough or if dynamic shadows are disabled, the same scene will look like this:
● Due to old Unity limitations, rendering Shadowmask lightmaps on versions prior to 2017.3 may
clear the light probes. They will need to be re-rendered again after bake. It shouldn’t happen on
2017.3 and newer versions.
-Directional mode: defines how directional information is baked. Standard lightmaps only store a single
color per texel, while directional lightmaps give shaders a hint of how lighting changes over a
hemisphere around the texel. This data is required to combine fully lightmapped areas with normal
maps. Plugging it into the built-in Bakery shader can also produce approximate specular response. The
available modes are:
-None: no directional data, single color per texel.
-Baked Normal Maps: still no directional data, but normal maps are taken into account when
rendering the lightmap. There is no additional runtime overhead. Since lightmaps usually have
lower resolution than normal maps, the result may look blurry. Other problems include aliasing
at distance due to lack of mipmapping and denoising step potentially smudging the detail. To
learn how to use custom shaders with procedural normals in this mode, read Shader
Compatibility section.
-Dominant Direction: this mode is similar to what Enlighten and Progressive bake in Unity. It is
compatible will most shaders, only generates 1 additional map and the runtime overhead is
minimal. The downside is that bump-mapping looks rather faint and gray-ish and can be quite
different comparing to the same object under real-time lighting.
-RNM: based on Radiosity Normal Mapping technique originally invented for HL2 (slides) and
later used in many games (e.g. Mirror’s Edge). It generates 3 HDR maps in total, being the most
memory-demanding mode of all. Runtime overhead is still relatively low. This mode is more
precise than Dominant Direction. It is better at reproducing surface contrast and handling
colored lights affecting normal maps from different angles.
-SH: based on “Precomputed Global Illumination in Frostbite” paper. This is the highest quality
mode, giving much better surface contrast and representing differently colored lighting coming
from different directions. Generates 4 maps in total, only one of them being HDR, therefore
takes less memory than RNM. Runtime overhead is slightly higher than that of RNM.
● RNM and SH can be only used with Bakery shader or require adjustments to your
shaders.
● In RNM and SH modes, standard color lightmaps are not created. You need to either
have Bakery shader on all materials in the scene, or use Lightmap Groups to separate
RNM/SH objects from the rest.
● RNM and SH maps are applied to objects using MaterialPropertyBlock and so may be
not shown completely in Unity’s Lighting window.
● Dominant Direction, RNM and SH modes may require slightly more samples for GI and
Light Meshes to get comparable quality.
-Texels per unit: approximate amount of lightmap pixels per world unit. Affects the amount and
resolution of generated lightmaps.
● If object has a manually assigned lightmap (via Bakery Lightmap Group Selector component), it
will ignore this parameter.
Left: 5 texels per unit, right: 20 texels per unit.
Example values to get you started:
- Large outdoor area: 1 - 5
- Medium outdoor area: 10-20
- High quality interior: 100
Keep in mind that Texels Per Unit is base resolution, but every object can be additionally tweaked
using “Scale in Lightmap” option on Mesh Renderers as well as “Scale per map type”.
-Scale per map type: allows you to scale the resolution of color/shadowmask/direction maps differently.
For example, a common case would be to have low resolution indirect color but highly detailed
shadowmask. Note that scaling is applied after the lightmaps are rendered, so it won’t save baking
time. If “Adjust UV padding” is on, padding will be based on the lowest resolution map to prevent texel
leaking.
-Bounces: how many times light rays should bounce off surfaces. Usually lower values are sufficient for
outdoor scenes (e.g. a city), while higher values are required for more closed scenes (interiors, caves).
Note how more bounces bring more light to closed spaces.
-Samples: affects quality of GI. Typical values are from 16 to 32.
Left: samples = 4, right: sample = 16. Denoising is off for illustrative purposes.
-GPU Priority: while GPU is working on lightmaps, OS and other software may become less
responsive. This option allows you to balance between baking speed and system responsiveness.
-Render: bakes lightmaps for all opened scenes.
-Render Selected Groups: only bakes Lightmap Groups containing selected objects.
● Not only selected objects will be redrawn, but all Lightmap Groups they belong to. Other
lightmaps will not be updated. If objects are not a part of some manually assigned group, then a
part of the scene using the same lightmap will be rebaked.
-Render Light Probes: bakes light probes for all opened scenes.
-Render Reflection Probes: bakes reflection probes for all opened scenes.
-Update Skybox Probe: bakes skybox reflection/light probes for the current skybox.
-Occlusion probes checkbox: when Render Light Probes is pressed, lets Unity bake occlusion probes
using currently selected built-in lightmapper. Occlusion probes prevent dynamic objects from getting lit
in shadowed areas. Currently there is no way to use custom occlusion probes in Unity, and it has to call
its own lightmappers instead to do the job.
-Warnings: these options will validate the scene after one of the Render buttons is pressed and show
warning dialog boxes asking to continue or stop the baking process. There are 3 options:
-UV validation: will check if all models have fully correct lightmapping UVs - specifically if they
lie within 0-1 range and don’t overlap.
-Overwrite check: will tell which lightmap files are going to be overwritten.
-Memory check: will tell a very approximate amount of video memory required.
Advanced settings
-Adjust UV padding: if enabled, will look for models with auto-generated UVs (“Generate Lightmap
UVs” on the asset) and adjust them further to have proper padding between UV islands per-mesh.
Model-wide Pack Margin in importer settings is ignored. Optimal values are calculated instead, given
area of each mesh and lightmap resolution.
-Denoise: if enabled, will apply denoising algorithm. Bakery uses Nvidia’s AI denoiser.
Left: denoising off, right: denoising on.
-Fix Seams: if enabled, will attempt to blend seams created by UV discontinuities. Useful for smooth
geometry, including Unity’s default sphere.
Left: seams, right: seams are fixed.
-Emissive boost: multiplies any surface emission by this number.
-Backface GI: determines how much light is passed through front faces to back faces and then
bounced off by GI. This is especially useful for thin translucent surfaces like leaves. Values are in 0-1
range:
Left: backface GI = 0, right: backface GI = 1.
- Ambient occlusion: simple non-physical ambient occlusion you can apply over final scene lighting for
aesthetic purposes.
Left: AO off, right: AO on.
-Intensity: controls visibility of the AO effect. Value of 0 disables the effect.
-Radius: determines the ray distance used in the AO effect. Smaller values give localized
occlusion (corners, wrinkles), while larger values make it more similar to Skylight, giving
shadows from distant objects.
-Samples: affects the quality of ambient occlusion. Typical values are from 4 to 32.
-GI VRAM optimization: toggles memory optimization used for very large scenes, especially when
baking too many lightmaps at once. If enabled, may slow down rendering a little bit. If disabled, and the
scene is too big, Bakery may go out of memory.
- Auto: guess if optimization is needed based on open scenes. The guess is only approximate, so
if you know the scene is huge, set it to Force On.
- Force On: always enabled.
- Force Off: always disabled.
-Tile size: same as GPU Priority, but instead of abstract priority you set tile size. Bakery splits lightmaps
into smaller tiles and updates one at a time. Smaller size means more GPU work interruptions, and can
make system more responsive.
-Temp path: temporary files folder. Bakery may require a few gigabytes of free space during rendering.
Having this folder on SSD can make rendering slightly faster comparing to HDD. At the moment, this
folder is not cleaned automatically. You can delete its contents anytime (except during rendering).
-Output path: lightmap folder. This is where all lightmap, and also lightprobe and vertex color assets
will be saved. This path is relative to your Assets folder.
Experimental settings
-Export geometry and maps: if enabled, Bakery will export the scene to its format before rendering. If
you are sure that geometry and textures of the scene and lightmap resolution settings were not
changed (e.g. you are only tweaking GI or light settings), you can disable this checkbox to make next
rendering faster.
-Update unmodified lights: if enabled, Bakery will recalculate light sources that didn’t change since
last rendering. If you are only tweaking one light and don’t want to wait for other lights to re-render, you
can disable this checkbox.
-Update modified lights and GI: if enabled, Bakery will recalculate GI and lights that were changed
since last rendering.
-Output texture type: defines Texture Type on lightmap assets. You want it to be set to Lightmap most
of the time, but it was noticed that on 5.6.x and maybe earlier 2017 versions of Unity Default can give
better quality.
Scale In Lightmap
Scale In Lightmap option available on all Mesh Renderers will affect object resolution in
automatically-generated lightmap atlases. Also, similarly to built-in Unity lightmappers, setting this value to 0
will make object not have any lightmaps, but cast lightmap shadows and affect GI on baked objects.
Components
Bakery Lightmap Group Selector
Specifies which Lightmap Group to use for the object and all of its children.
Lightmap Group is a term Bakery uses for a collection of objects sharing 1 lightmap. Groups have properties
telling Bakery how to pack the objects, which lights should affect them, should the result be baked into a
texture or vertices.
By default all static objects are automatically packed into multiple lightmaps groups, so you don’t have to
worry. Defining groups manually should be only used for special purposes, for example:
- Marking certain objects use per-vertex lightmap instead of textures.
- Baking a lightmap using exact unscaled UVs as they were in a modeling package.
- Grouping certain areas of the level to use single lightmap to facilitate resource streaming or to switch
different baked lighting at runtime via scripts.
- Using Render Selected
button to only update grouped objects.
To manually define a group, you create Lightmap Group Assets, either by using Assets->Create menu, or
using the Create New button in the component. When using the Create New button, new asset will be created
based on these forms:
- Name: name of the Lightmap Group Asset to create.
- Packing mode: this selector defines the packing mode
of the Lightmap Group. There are 3 modes:
- Original UV: object and its children will be baked with unmodified UVs. No packing is performed.
This is useful for models when multiple meshes share the same already packed UV layout.
- Pack Atlas: object and its children are packed into a dedicated texture atlas. Before v1.3 every
packable child needed to have the component, but it’s no longer necessary. Every child will be
packed as its own rectangle, except when Bakery auto-detects a child having non-overlapping
sub-children, in which case multiple objects can use a single rectangle.
- Vertex: object and its children will use vertex-colored baked lighting instead of textures. Note
that you’ll need a custom shader for this to work, like Bakery Shader. One simple shader
("Bakery/Simple Vertex Lightmapped") is also included for demonstration and reference. See
notes.
- Directional mode: allows you to override directional mode on the group. Options are the same except
for Auto
, which will simply use the global setting.
- Resolution: desired lightmap resolution.
- Bitmask: a list of toggles used to exclude light sources from affecting the lightmap. Every Bakery light
source also has a bitmask setting. Lights only affects Lightmap Groups with which they share at least
one of these toggles. Default settings mean all lights affect all lightmaps.
If you have a Lightmap Group with the Pack Atlas mode assigned, additional settings will appear on the
component:
- Override resolution: override the resolution this object and its children occupy in the lightmap.
- Resolution: manually defined resolution. For example, if you have a lightmap with a
resolution of 512 and it is assigned to 4 objects with override resolution set to 256,
Bakery will generate a single 512x512 lightmap where each object takes exactly
256x256 square.
Bakery Direct Light
Infinitely distant directional light (e.g. Sun). Settings:
- Color: color.
- Intensity: linear color multiplier.
- Shadow spread: size of the light source or, simply put, shadow blurriness. 0 = max sharp shadows, 1 =
max blurred shadows. Technically it interpolates from a single ray to a wider cone of rays.
Left: shadow spread = 0.01, right: 0.05. Note how shadows start sharp and get gradually blurrier with
distance.
- Shadow samples: affect shadows quality. The smaller the Shadow Spread value, the less samples are
needed for a clean image. Typical values for sun shadows are from 1 to 16. Setting samples to 0 will
make shadows from this light disappear.
- Bitmask: a list of toggles used to exclude this light source from affecting particular Lightmap Groups.
- Bake to indirect: if enabled, then complete lighting (both direct and indirect contribution) from this light
will be baked in Indirect or Shadowmask render mode. Incompatible with Shadowmask checkbox.
- Shadowmask: bakes a separate shadow mask for this light, so dynamic and static shadows can be
mixed. Only works when render mode is also set to Shadowmask. Incompatible with Bake To Indirect
chekbox.
- Denoise shadowmask: determines if denoising should be applied to this light’s shadowmask. Usually
it’s not necessary as shadows don’t exhibit much noise, but can be useful for very wide blurry shadows
(large shadow spread).
- Indirect intensity: non-physical GI multiplier for this light. Should be 1 for natural lighting, but can be
modified for more stylized scenes.
- If the same object has both Unity and Bakery light sources enabled, and they don’t match, 2 buttons
will appear:
- Match lightmapped to real-time: copy common settings from Unity light to Bakery light.
- Match real-time to lightmapped: copy common settings from Bakery light to Unity light.
Bakery Sky Light
Infinitely distant shadowed ambient light (sky). Settings:
- Color: color.
- Intensity: linear color multiplier.
- Sky texture: optional cubemap asset, e.g. HDRI panorama to affect lighting colors from different
directions.
● Rotating sky light’s GameObject will rotate lighting from the cubemap accordingly.
- Samples: affects shadows quality. Typical values are from 8 to 32.
- Hemispherical: if enabled, lighting will only come from above (upper hemisphere). Otherwise from all
directions
.
Left: non-hemispherical, right: hemispherical.
- Bitmask: a list of toggles used to exclude this light source from affecting particular Lightmap Groups.
- Bake to indirect: if enabled, then complete lighting (both direct and indirect contribution) from this light
will be baked in Indirect or Shadowmask render mode. This is the default behaviour for all Sky Lights,
as there is no real-time version to emulate them in Unity.
- If sky light’s settings and current scene skybox don’t match, 2 buttons will appear:
- Match this light to scene skybox: copy common settings from active skybox material to Bakery
sky light. Currently it can only match skyboxes using the “Skybox/Cubemap” or “Skybox/Bakery
skybox” shaders.
- Match scene skybox to this light: copy common settings from Bakery sky light to scene skybox.
Bakery Light Mesh
Emissive mesh of any shape. Should be used together with the Mesh Renderer component or with a Light
component set to Area mode. Settings.
- Color: color
- Intensity: linear color multiplier.
- Cutoff: maximum lighting distance. Bakery uses Skyforge falloff formula to balance between correct
inverse-squared falloff and practical limits. It’s the best when cutoff value is just where physical falloff
gets very dim.
- Samples Near: affect lighting quality near the mesh. Typical values are from 16 to 64.
● “Samples Near” is only available when Self Shadow is on.
- Samples Far: affects lighting quality far away from the mesh. Typical values are from 4 to 4096.
● Bakery mixes 2 different algorithms for area lights based on texel proximity to the light. Close to
the light it works similar to the GI algorithm, while far away the light is approximated as a cloud
of virtual point lights.
● If you keep getting dirty/noisy results, try setting Samples Near to 0. Then only the VPL
algorithm is used. It is also useful for very simple lights where precision is not important (e.g.
window lights on a building).
● Light Meshes don’t receive lighting on their own and don’t get lightmapped.
● One Light Mesh with many polygons is faster to bake than many simple Light Meshes.
Left: Samples Near = 0, Samples Far = 4096.
Middle: Samples Near = 0, Samples Far = 128.
Right: Samples Near = 16, Samples Far = 128.
Note how the lighting appearance is similar, yet less combined samples are used.
- Self Shadow: determines if light mesh itself casts shadows.
Left: light mesh casts no shadow, right: light mesh casts a shadow behind.
- Bitmask: a list of toggles used to exclude this light source from affecting particular Lightmap Groups.
- Bake to indirect: if enabled, then complete lighting (both direct and indirect contribution) from this light
will be baked in Indirect or Shadowmask render mode. This is the default behaviour for all Light
Meshes, as there is no real-time version to emulate them in Unity.
- Indirect intensity: non-physical GI multiplier for this light. Should be 1 for natural lighting, but can be
modified for more stylized scenes.
- If mesh material and light settings do not match, 2 buttons will appear:
- Match light to material: copy common settings from unlit mesh material or area light to Bakery
light.
- Match material to light: copy common settings from Bakery light to unlit mesh material or area
light.
Bakery Point Light
Point light, doesn’t have area. Despite physical impossibility it is useful for games and the only way to match
Unity’s point and spot lights. Settings:
- Color: color.
- Intensity: linear color multiplier.
- Shadow spread: shadow blurriness. Although point lights don’t have area, it is often desired to still have
blurred shadows from them. For this purpose shadows are simulated as if they were cast from a
spherical area light. This parameter defines the radius of such virtual sphere, directly affecting
blurriness.
Left: Shadow Spread = 0.5, right: Shadow Spread = 1.
- Physical falloff: if enabled, will use Skyforge falloff formula to balance between correct inverse-squared
falloff and practical limits. Otherwise will try to mimic Unity’s falloff. Learn more in the Bakery Shader
Tweaks section below.
- Range: if physical falloff is disabled, equals to Unity’s light range. If it’s enabled, will only slightly fade
away physical falloff at the edge.
- Samples: affects shadows quality. Typical values are from 1 to 512. Setting samples to 0 will make
shadows from this light disappear.
- Projection mask: type of mask/cookie. Options:
- Omni: no mask, equals to Unity’s Point Light.
- Cookie: cookie texture projection. Additional options:
- Cookie texture: 2D texture asset. Bakery includes the original Unity’s Spot Light texture
(named ftUnitySpotTexture) that you can use to mimic it.
- Angle: texture projection angle (similar to Unity’s Spot Light).
- Cubemap: cubemap cookie projection. Additional options:
- Projected cubemap: cubemap asset.
- IES: lighting is modulated by the IES file data. Additional options:
- IES file: file with .ies extension.
Left to right: Omni, Cookie (default spot texture), Cubemap, IES.
- Bitmask: a list of toggles used to exclude this light source from affecting particular Lightmap Groups.
- Bake to indirect: if enabled, then complete lighting (both direct and indirect contribution) from this light
will be baked in Indirect or Shadowmask render mode. Incompatible with Shadowmask checkbox.
- Shadowmask: bakes a separate shadow mask for this light, so dynamic and static shadows can be
mixed. Only works when render mode is also set to Shadowmask. Incompatible with Bake To Indirect
chekbox.
- Indirect intensity: non-physical GI multiplier for this light. Should be 1 for natural lighting, but can be
modified for more stylized scenes.
- If the same object has both Unity and Bakery light sources enabled, and they don’t match, 2 buttons
will appear:
- Match lightmapped to real-time: copy common settings from Unity light to Bakery light.
- Match real-time to lightmapped: copy common settings from Bakery light to Unity light.
Bakery Shader Tweaks
Bakery offers optional shader modifications that can be applied to Unity shaders to improve graphics. Shader
tweaking menu can be accessed via Bakery->Shader Tweaks.
These options will patch base Unity shader includes (from the CGIncludes folder) that are used by most built-in
and third party shaders. All modifications will affect all projects opened with this version of editor
, but can be
also easily reverted back.
● Shader Tweaks currently don’t work for HDRP and LWRP.
All available modifications are presented as buttons. Press the button to apply modification, and it will remain
pressed. Un-press the button to remove the modification. Currently available options:
- Use bicubic interpolation for lightmaps: use bicubic interpolation instead of default bilinear. This tweak
fixes many jagged edges of low resolution lightmaps pretty well. Currently it only works on DX11 and
modern consoles, while other platforms will remain using bilinear interpolation.
-
Left: default bilinear filtering. Right: bicubic filtering.
- Use multiplication for shadowmask: combine static and dynamic shadows using multiplication instead
of minimum. For reasons unknown Unity decided to use minimum operator by default, and it produces
artifacts that are not present with multiplication:
Left: both shadows are baked.
Center: spherical shadow is dynamic, and other shadow is static. Combined together with this shader tweak.
Right: same as center, but without the tweak.
- Use physical light falloff (forward): replace default attenuation of real-time point/spot lights with
physically correct inverse-squared. “Range” will only slightly fade it out near the edge (matches Bakery
lights with Physical Falloff checkbox). Only affects forward renderer.
- Use physical light falloff (deferred): same as above, but only affects deferred renderer.
Left: Unity falloff. Right: physical falloff.
Note an unavoidable unrealistic abrupt end of the Unity falloff.
Keep in mind that physical falloff acts differently. Instead of range scaling the exact same gradient from
center to the edges, physical falloff is mainly influenced by light’s brightness. “Range” in this case is a
mere optimization that slightly fades it near edges. It is highly recommended to enable tonemapper
when setting up lights with physical falloff.
Top row: Unity falloff. Bottom row: physical falloff.
Note how Unity scales lighting with the range parameter, whereas physical falloff is only additionally
masked by range.
Left: no tonemapping, right: neutral tonemapping enabled.
Note how lighting retains soft gradient, when tonemapping is enabled, yet still being physically bright.
Best Practices
To maximize quality and minimize memory consumption:
- Unwrap in your modeling package, don’t use “Generate UVs” in Unity. Because both Unity and Bakery
pack unwrapped objects into atlases simply as rectangles (they can’t modify UVs at this point), and
every separately unwrapped object can have wasted UV space, this space accumulates, and you pay
more memory for less resolution. In 3dsmax, even automatic Flatten Mapping is good enough.
- Set Spacing between UV charts to 3 / lightmapResolution. E.g. if you know certain objects you
unwrapped will be rendered into a single 512x512 lightmap, set spacing to 3/512 =
0.005859375.
- Try to unwrap all non-repeating geometry into the smallest amount of very dense UV layouts. In
Unity, create and assign a Lightmap Group asset for every layout with proper resolution and
Simple mode.
- Don’t unwrap heavy repeating geometry into the same atlas though, or you will lose instancing.
- Use physical falloff. Unity’s falloff is only good for non-tonemapped non-HDR games with arbitrary fake
lighting intensities.
- Don’t work without tonemapping. Real lighting intensities are BRIGHT. Working with a scene without a
tonemapper is the same as looking at an un-edited RAW file from a camera instead of using your eyes.
Unity’s built-in Neutral tonemapping is a good start. Proper lighting brightness guarantees global
illumination will be bright enough without faking its intensity.
Differences between Light Mesh and emissive materials
Emissive material:
- Propagates light during GI calculation, therefore is “free”, no matter how many meshes are emissive.
- Small and bright lights can give inaccurate noisy results, depending on GI sample count.
- Has to occupy space in lightmap due to the way GI in Bakery works, therefore possibly wasting it.
Light mesh:
- Lighting is calculated separately for each light, therefore is slower than emissive materials.
- Designed to give clean results for small and bright lights, even very far away from them.
- Doesn’t take space in lightmaps.
Vertex Lightmap notes
Objects can be baked on per-vertex level instead of having textures, if they or their parent have a Lightmap
Group Selector component with Lightmap Group asset set to Vertex mode.
Vertex lightmaps are compatible with shadowmasks, as well as Dominant Direction and SH modes.
● It is recommended to disable vertex compression for TEXCOORD2 and TEXCOORD3 in Player
Settings if you use directional vertex lightmaps.
There are pros and cons using vertex lightmaps.
Pros:
- No UVs needed. Suitable for complex geometry that is impossible to unwrap well.
- No space wasted - padding and empty spaces in the lightmap are not a problem.
Cons:
- Obviously vertex interpolation is less subtle than texel interpolation.
- Normal texture compression techniques do not apply.
- Modified shader needed (Bakery includes such shaders).
- Denoising is not applied.
Shader compatibility
To make global illumination work, Bakery needs to extract material information.
Before v1.1 it simply checked for common shader parameter names such as _MainTex, _Color, _EmissionMap
and _EmissionColor and used those.
Since v1.1 Bakery supports GI from custom shaders by using their existing Meta Pass definition, so it should
work exactly the same way as with built-in lightmappers. Standard, HDRP and LWRP shaders already contain
proper Meta Pass code, as well as any custom surface shader. For completely custom (non-surface) shaders
you’ll need to either write Meta Pass yourself (refer to Unity manual) or rely on Bakery’s legacy behaviour
(using shader parameter names). Currently Bakery only takes albedo and emission from Meta Pass. Opacity
maps are still taken by name (_MainTex or _BaseColorMap alpha channel) to keep their resolution intact.
Baked Normal Maps mode
In Baked Normal Maps directional mode, normals are taken from materials by name and should be
named _BumpMap. Tiling and offset are extracted from _MainTex_ST. It is however possible to make
completely custom shaders with advanced normal mapping features (e.g. blending multiple layers)
compatible. Because standard Unity Meta Pass doesn’t export normal information, a special extended
Bakery Meta Pass should be added to your shader.
Bakery includes 2 example shaders implementing this Meta Pass. You can find them in
Assets/Bakery/examples/shaders
.
Here is the list of differences comparing to the standard Meta Pass:
- Pass should be named “META_BAKERY”.
- Bakery/BakeryMetaPass.cginc needs to be included.
- If unity_MetaFragmentControl.z variable is not 0, shader should return world-space normal.
- Returned normal should be encoded using BakeryEncodeNormal.
Bakery Shader
Since v1.4 Bakery includes its own shaders with support for vertex lightmapping, as well as RNM and SH
directional modes. It also allows approximate baked specular to be calculated from directional data.
Bakery shader is not required for regular color lightmaps, shadow masks and Dominant Direction
mode, as these features are supported by most Unity shaders anyway.
At the moment, there are 4 additional shaders:
-Bakery/Standard: extends regular Standard shader. Additional options available:
- Allow Vertex Lightmaps: allows this material to be used with vertex lightmapping.
- Allow RNM Lightmaps: allows this material to be used with RNM directional mode.
- Allow SH Lightmaps: allows this material to be used with SH directional mode.
● All “Allow” toggles enable a certain code path in the shader. It is recommended to only
use one “allow” option in a material for performance reasons.
- Enable Lightmap Specular: calculates baked specular using data from Dominant Direction,
RNM or SH directional modes. Note that due to the lack of information, the effect is very
approximate
. If you ever used baked specular in Unity 4, it should be comparable. It looks best
together with highly perturbed normal maps, not so good on flat surfaces.
- Enable VertexLM directional: if vertex lightmaps are present, specifies that Dominant Direction
data is stored in vertices and should be used.
- Enable VertexLM SH: if vertex lightmaps are present, specifies that SH data is stored in vertices
and should be used.
- Enable VertexLM Shadowmask: if vertex lightmaps are present, specifies that shadow mask is
stored in vertices and should be used.
- Non-linear SH: in SH directional mode this option can enhance contrast (closer to ground truth),
but it makes the shader a bit slower.
- Force Bicubic Filter: enables bicubic filtering for all additional maps. For complete bicubic
filtering (including the first color map) it is recommended to also enable it in Shader Tweaks.
-Bakery/Standard Specular: same as Standard, but for specular workflow.
-HDRenderPipeline/Bakery Lit: extends HDRP Lit shader. Currently it only has one additional option,
namely Allow SH Lightmaps. This shader is zipped by default to prevent errors in non-HDRP projects
and can be found in Assets/Bakery/shader/BakeryHDRPShader.zip
.
-LightweightPipeline/Bakery Standard (Physically Based): extends LWRP standard PBR shader.
Currently it only has two options: Allow RNM Lightmaps and Allow SH Lightmaps. This shader can be
found in Assets/Bakery/shader/BakeryLWRPShader.zip
.
Feature support accross shaders
Most Unity shaders
HDRP &
LWRP shaders
Bakery Standard
Bakery
HDRP
Bakey
LWRP
HDR color lightmaps
Yes
Yes
Yes
Yes
Yes
Shadowmask
Yes
Yes
Yes
Yes
Yes
Dominant Direction
Yes
Yes
Yes
Yes
Yes
RNM
No
No
Yes
No
Yes
SH
No
No
Yes
Yes
Yes
Lightmap specular
No
No
Yes
No
No
Bicubic filtering
Yes with Shader
Tweaks
No
Yes with Shader
Tweaks
No
No
Vertex lightmaps
No
No
Yes
No
No
● Everything except for regular color lightmaps requires at least Shader Model 3.0 to work.
● Vertex Lightmaps with SH mode require at least Shader Model 4.0 due to interpolator limit.
FAQ
Q: Does it have realtime GI?
A: No.
Q: What about mixed lighting?
A: Yes! Bakery supports baking indirect separately to use with real-time lights, and also baking static shadows
(shadowmask) and combining them with dynamic.
Q: I can't get shadowmask to work
A: Check following things:
- Bakery's Render Mode is set to Shadowmask
- Masked lights have both Unity and Bakery light components on them.
- Masked Bakery light components have "shadowmask" checkbox enabled on them.
Q: I rendered shadowmasks, but all shadows are dynamic
A: You're in Distance Shadowmask mode, it's expected
- Read about the difference:
https://docs.unity3d.com/Manual/LightMode-Mixed-Shadowmask.html
https://docs.unity3d.com/Manual/LightMode-Mixed-DistanceShadowmask.html
- To switch between two modes, you can use "Distance Shadowmask" checkbox in Bakery main window.
- If you're on 5.6, go to Window->Lighting->Mixed Lighting->Lighting Mode to switch the mode.
Q: What about bump/specular in shadowed areas?
A: Directional lightmaps are on the way and should be available in the next release.
Q: Which platforms are supported?
A: You can ship games with Bakery lightmaps on any platform. But for using Bakery you will need a 64-bit
Windows (7+) machine with a Nvidia (6xx or newer) card.
Q: Is it progressive? Does it show lightmap updates in real time?
A: No. Just a progress bar.
Q: How do I make a lightmapped prefab?
A: There is no proper interface for this functionality currently, but it’s doable, if you really need it:
- Create a scene for your prefab
- Create an empty GameObject named !ftraceLightmaps
- Bake the scene
- You should now see a component added on the empty object. Put it inside the prefab and save.
Such prefab will be always lightmapped. Note, that baking a combined scene with multiple prefabs like
these is not supported.
Q: How do I use git/collab/other version control system with Bakery?
A: If you are using “Adjust UV padding” option (which is on by default), there can be some difficulties with
version synchronization across machines, since this option post-processes UVs on existing models.
Currently apart from your scene you need to push ftGlobalStorage.asset, where model processing directions are
stored. If UVs still look broken on another machine, try replacing ftGlobalStorage manually (not via version
control) and reimporting the model via right-click. There is ongoing work to make version control smoother.
Q: How do I bake using my own UVs without any alterations to them?
A: Check out Lightmap Groups.
Reporting bugs
If you encounter any problems with Bakery, please:
- Contact me anywhere, preferrably on Unity forum.
- Take screenshots of any errors or bugs.
- If it’s an error/crash:
- Also take a screenshot of Unity console with info/warning/error logging enabled
- Remember what was the last text shown on the progress window, as it will tell at which task
exactly a problem occured.