009rendering Lab Manual-Part I
009rendering Lab Manual-Part I
009rendering Lab Manual-Part I
Introduction
In this lab, you will setup a simple scene in Unity for global illumination, getting familiar with lighting
rendering effect with various materials or different types of lights.
After implementing this lab, you will know how to: (Bold lines are covered in Part I)
1. Set up materials for global illumination in Unity.
2. Set up Unity’s lightmapper.
3. Set up reflection probes and link custom shaders to materials
4. Set up an ambient light and customize a skybox
5. Set up common four types of lights for rendering in Unity
6. Make use of different effects among four types of light in Unity
7. Create a new scene with customized texture.
1. Materials
Rendering is the interaction between light, geometry and materials. As such, it is important to know
how to control the materials in a scene.
In this part, we will use a variant of the famous Cornell Box scene (reference:
https://en.wikipedia.org/wiki/Cornell_box) to explore various material rendering functionalities.
Open project First, let’s open the included “Cornell Box” unity project. You will see a gray-looking
scene (see Figure 1.1.1).
Figure 1.1.1 Cornell Box Scene
Right now, everything is gray because we have not set up the materials and lighting. For your
convenience, the objects and camera have already been set up. Now you need to set up the materials
and lighting.
Create a new default material Let’s add a new material. Click the “Assets” window and click “Create”
→ “Material” (see Figure 1.1.2).
All new materials use Unity’s default shader by default. This shader is able to handle a wide variety of
shading and we will use it for most of our objects in Material Part.
Figure 1.1.2 Create a new material
Rename material We will name our first material “Plane Default Material” (see Figure 1.1.3). For this
material, we won’t change anything and use it as it is.
Assign material to three planes This material will be assigned to three planes: the floor (Plane Bottom),
the back wall (Plane Back), and the ceiling (Plane Top).
Drag material from the “Assets” window and drop it onto each of three planes in the Scene window (or
in the Hierarchy window). (see Figure 1.1.4)
Set material color Next, we will make the material for the left wall. Let’s name it “Plane Left Material”.
Then make this material red: under “Albedo”, give it a value of “R:255, G:0, B:0”, or a hex value of
“#FF0000” (see Figure 1.1.5).
Assign colored material to plane Drag and drop the “Plane Left Material” to the left wall and the
“Plane Right Material” to the right wall. You should see that the left wall becomes red and right one
becomes green (see Figure 1.1.7).
Figure 1.1.7 Set colored material to plane
Set object as visible light Finally, let’s add a light to the scene. Although Unity offers various kinds of
invisible light sources, we will create a light by assigning a light-emitting material to a visible object
instead in this Material Part. This method is used for its physical accuracy (light sources in reality are
visible objects), and robustness (it automatically handles soft-shadows and many kinds of lighting
phenomena).
Create a new material call “Plane Light Material”. To make it emit light, check the “Emission” checkbox.
Under “Color”, give it a value of “R:191, G: 191, B: 191”, or a hex value of “#BFBFBF”. This is Unity’s
value for white lights. Then, set the “Intensity” to 2, to make it strong enough (see Figure 1.1.8).
Also, under “Global Illumination”, select “Baked”. This will make Unity’s lightmapper consider this
material for its rendering pre-calculations.
Figure 1.1.8 Set visible emissive object as light
Drag and drop this material to the small square on the ceiling (see Figure 1.1.9). The emissive ceiling
now is our main light source within the box.
Unlike conventional rendering software which shoots rays from a camera, Unity uses a hybrid approach
which combines ray-tracing and rasterization. At the start of a scene, Unity does a precomputation pass
called lightmapping, which shoots rays from the surfaces of objects to compute the amount of light
received at each surface point in the scene. These illumination values are then stored in a texture called
lightmap. During a game, this lightmap is then used to incorporate global illumination for rasterization in
real-time.
Of course, this approach has its limitations, but it is a good balance between realism and real-time
performance. For example, lightmaps can only consider light bounces amongst static objects in the
precomputation phase. There are also some global illumination effects that cannot be handled with
lightmaps.
Open lighting settings window To enable and tweak Unity’s lightmapper, we will need to display the
“Lighting” window. It can be enabled under “Window” → “Rendering” → “Lighting Settings”. You should
be able to see the “Lighting” window (see Figure 1.2.1). For ease-of-use, we can drag it to a suitable
position. For our examples, we will drag it to the right of the screen (see Figure 1.2.1 right).
Set configuration of lightmapper Let’s configure the lighting settings. We will use the following
settings to give a good level of accuracy that should not take too long to compute (see Figure 1.2.2).
Checke
d
Checke
d
“Baked Indirect”
Direct Samples: 8
Lightmap Resolution: 10
Label objects for precomputation Now we still must do one more step before we can see the effects
of global illumination. Recall that lightmapping is a precomputation pass that calculates light bounces
amongst static objects. As such, Unity requires that we label any objects we want to use in the
precomputation pass as static(non-moving) objects.
In the “Hierarchy” window, select all objects except the Main Camera (see Figure 1.2.3). Then under the
“Inspector” window, check the “Static” checkbox, wait for a while and you can see the rendered result
(see Figure 1.2.4).
Figure 1.2.3 Select object for lighting calculation
In “Inspector” window, let’s name this probe “Reflection Probe 1” and give it a position of “X:2, Y: -3.33,
Z: -1” (same position as left sphere) to place it at the center of the left sphere (see Figure 1.3.1.2).
Figure 1.3.1.2 Locate the reflection probe 1 in the center of left sphere
We will also need to increase the “Box Size” to “X:50, Y:50, Z:50”, so that the probe can capture the
entire scene (see Figure 1.3.1.3).
Figure 1.3.1.3 Enlarge “Box Size”
We will make another reflection probe by duplicating the current one. Right-click on it in the “Hierarchy”
window and click “Duplicate” (see Figure 1.3.1.4).
Likewise, let’s name the second probe “Reflection Probe 2” and give it a position of “X: -2, Y: -3.33, Z: 2”
(same position as right sphere) to place it at the center of the right sphere (see Figure 1.3.1.5).
Figure 1.3.1.5 Locate the reflection probe 2 in the center of right sphere
We will need to make the two spheres use the closest reflection probe. Select the two spheres and
under the “Inspector” window’s “Mesh Renderer”, select the “Reflection Probes” to “Simple” (see
Figure 1.3.1.6).
Drag and drop the material to the left sphere. It should have a mirror-like surface now.
To import the shader into the Unity project, drag and drop it from your file explorer into the “Assets”
window, or import new asset by selecting “Assets”→ “Import New Asset…” and import the shader file
(see Figure 1.3.3.1).
Next, we will need to create a material that uses this shader. Create a new material and call it “Glass
Material”. In the “Inspector” window, under “Shader”, select “Custom” → “Refract Reflect Shader” (see
Figure 1.3.3.2).
We will need to adjust the material properties to make it look like glass. First, give it a “Metallic” value
of “1” and a “Smoothness” value of “0.95”, so that it has a mirror-like reflective surface. For the “Index
of Refraction”, the default value of “1.52” is suitable for glass. To make it transparent, under “Albedo”,
set the alpha value to “20” (lower alpha value = more transparent). (See Figure 1.3.3.3)
Figure 1.3.3.3 Set glass material properties
Drag the material to the right sphere, and you should see a glass sphere (See Figure 1.3.3.4).
You should be able to see the reflection of the glass sphere in the mirror sphere. If the glass sphere
appears as a black sphere in the reflection, try the followings (see Figure 1.3.4.1):
1. In the “Hierarchy” window, select the two reflection probes.
2. In the “Inspector” window, toggle “Use Occlusion Culling” on/off under the cubemap settings.
3. If that still doesn’t work, try deselecting “Transparent FX” under the “Culling Mask” option.
4. If it still doesn’t work, change “Clear Flags” to “solid color” and change it back to “Skybox”.
5. If it still doesn’t work, try changing all attributes under the cubemap settings and change
them back.
Figure 1.3.4.1 Debugging
First, drag and drop a normal map image into the “Assets” window. A normal map should look like a
blue-ish texture, due to how the RGB values are used to hold the XYZ values of the normal directions.
Then, select an object you want to assign the normal map to (e.g. the metal sphere). Under the
“Material” window, double click the “Normal Map” option and select the normal map. The object should
have a “bumpy” looking appearance.
Figure 1.4.1 Apply normal map to material
Note: the glass sphere does not support normal mapping currently due to shader limitations.
2) Adjust the number of bounces under the Lightmapping settings in the Lighting window. Try the
following values: None, 1, 2. For each value, take a screenshot of the final result. Try telling the
differences in the final results. (You can ignore the reflection and refraction on the spheres, as the
number of bounces used by reflection probes is not controlled by the lightmapper settings)
3) Replace one of the spheres with a 3D object that is imported from Rhino or Blender or any preferred
external 3D modelling program of your choice. You can export a model as an .obj file and import it into
Unity (drag and drop it into the “Assets” window, then drag to the scene).
4) Recall that there are various global illumination effects. Compare the result of the Cornell box in this
lab against the ones in http://graphics.stanford.edu/~henrik/images/cbox.html. Identify one global
illumination effect that is missing in the current Unity implementation.