|
|
|
# Reflection Probes and Unity
|
|
|
|
## Purpose of this guide
|
|
|
|
Unity's reflection probe system is a little confusing and convoluted. Things that would seem to be good practise at first turn out to be horrible mistakes for newcomers. After passing around lots of similar advice for years, I've decided to collate it all into one page.
|
|
|
|
|
|
|
|
I'll cover how they work, and more importantly, how they can and should be used in worlds.
|
|
|
|
|
|
|
|
## The basics of reflection probes
|
|
|
|
A reflection probe captures an image of the world around it and stores it into a "cubemap" - a six-sided texture that can fill every side of a cube.
|
|
|
|
|
|
|
|
Each side of the texture is square, and of the same resolution. This means a "512" resolution probe is six 512x512 textures, compacted together.
|
|
|
|
|
|
|
|
Reflection probes also store lower-resolution versions of their textures. These lower-resolution copies are blurred, and allow for the representation of rough or uneven surfaces realistically.
|
|
|
|
|
|
|
|
As objects are rendered in the scene, they will be asking Unity "what reflection probe am I in?". Unity will provide them the texture and location of the **two** closest probes to their anchor position. If only one probe is available, Unity will send one.
|
|
|
|
|
|
|
|
## How do they work for dynamic objects, like players?
|
|
|
|
Dynamic objects use the probes closest to their anchor position on their mesh.
|
|
|
|
|
|
|
|
![In this image, you can see the anchor point of an object. It's at the root of the object, rather than the middle as you might expect.](uploads/773640422d53034d63bfacdc82678ba8/probes1.png)
|
|
|
|
|
|
|
|
This object's anchor is, in fact, where the red arrow is pointing - even though the centre is elsewhere. Unity will use that position to pick the reflection probes for the model. This position is, by default, the "origin" of the mesh - the point at (0, 0, 0) that every vertex is placed around.
|
|
|
|
|
|
|
|
You can override this by setting a GameObject in the "Anchor Override" field on the Mesh Renderer.
|
|
|
|
|
|
|
|
![The Anchor Override field in use.](uploads/5968e3ff6b6411bf27c6eb3a9086f418/image.png)
|
|
|
|
|
|
|
|
## How do they work for static objects, like the map?
|
|
|
|
They work the same as for dynamic objects, which can cause some problems.
|
|
|
|
|
|
|
|
Unity has static batching, which combines multiple models into a single mesh, and renders them in a single draw call.
|
|
|
|
|
|
|
|
However, Unity will not combine objects affected by different probes.
|
|
|
|
|
|
|
|
You can partially work around this with Anchor Overrides. Objects using the same Anchor Override will sometimes be batched together. Unity will sometimes fail to batch them together, though, so in these cases you'll be required to merge the meshes manually to regain performance.
|
|
|
|
|
|
|
|
## How should they be set up?
|
|
|
|
Reflection probes capture an image of their surroundings into a texture. This means a few things
|
|
|
|
* A higher resolution probe is much sharper, but much much bigger, due to containing six textures.
|
|
|
|
* The texture is static. It can't change. It won't be updated if the surroundings change.
|
|
|
|
* They can only represent a single perspective.
|
|
|
|
* Despite all this, nobody's going to notice an inaccurate probe if it roughly fits the lighting of your scene.
|
|
|
|
|
|
|
|
So, here's my method for determining how to place probes in a scene.
|
|
|
|
|
|
|
|
### 1. Basic reflection probe
|
|
|
|
|
|
|
|
Even if you don't have a reflection probe, Unity will capture the skybox material into a reflection probe and hand it out. This reflection probe is given to everything by default.
|
|
|
|
|
|
|
|
Is the Unity skybox really representative of your scene? It probably isn't, so let's change that to something we set ourselves.
|
|
|
|
|
|
|
|
First, add a new Reflection Probe. Set the Type to "Custom".
|
|
|
|
* If you've marked all the objects in your scene as static, don't turn Dynamic Objects on.
|
|
|
|
* If you haven't marked your scene as static (because you haven't merged it, or can't use static batching) turn Dynamic Objects on.
|
|
|
|
Then select Bake at the bottom and place your Reflection Probe texture somewhere relevant to your scene.
|
|
|
|
|
|
|
|
![An example reflection probe setting.](uploads/0ee6fd9235386473a11c3d12a13c5c72/image.png)
|
|
|
|
|
|
|
|
Second, open the Lighting window from the Windows menu at the top. From there, set Environment Reflections to Custom, and drag your new probe in.
|
|
|
|
|
|
|
|
![An example Lighting setting.](uploads/505ac2516aae29304748cb2b2a8e770d/image.png) |
|
|
|
\ No newline at end of file |