# Project 4: Illuminate (Algo Answers)

You can find the handout for this project here.

## Raytracing Pipeline

List at least three aspects of the fully fledged raytracing pipeline that were omitted in Intersect, but are required for Illuminate. Explain how you can use your code from Intersect to implement these components. There is not necessarily a correct answer! We are looking for a qualitative description of your approach.

## Reflection Equation

Given an incoming light direction (from light source to point of intersection) and surface normal (on point of intersection), the equation for the reflected outgoing ray is given by:

Assuming both and are unit vectors, can you briefly explain in words why this equation makes sense? You may also include a diagram if it helps you to explain this.

is the projection of onto the normal axis. minus two of that gives us , because this reflects / negates the component of that's parallel to , but leaves the component of that is perpendicular to unaffected.

## Texture Coordinates

In Illuminate, you will be texture-mapping images onto your implicit shapes. One step of this process is taking a given intersection point, with known UV coordinates, and figuring out which pixel of the image we should use.

However, two different coordinate systems are in play here:

• Image coordinates have their origin at the top left of a width x height pixel grid. These are used for images like our Brush canvas, our Intersect output, and, most relevantly, images we use as textures.
• Texture (UV) coordinates have their origin at the bottom left of a unit square. These are used on the surfaces of our objects, as inputs to the equations you will write below.

Study the diagram below, then complete the next two questions, where you will define a mapping from UV coordinates to image coordinates.

### A Single Texture

Suppose we have an image of size , which we'd like to use as a texture.

What is the pixel index for a given UV coordinate ? Please use nearest-neighbor texture sampling, and be mindful of your bounds.

Note that you'll have to check for cases where (), or (). In those cases, it's fine to just subtract from the out-of-bounds index.

Explanation:

We can think of this as a map from continuous UV coordinates that range in to integer image indices that range in (width) and (height).

• We can simply scale and floor to obtain .
• However, since UV coordinates use the bottom-left corner as their origin, while images use the top-left corner, we have to "flip" before scaling and flooring.

### Repeated Textures

Suppose that we'd now like to repeat the texture times horizontally and times vertically.

Now, what is the pixel index for a given UV coordinate ?

Again, you'll have to check for cases where (), or (). In those cases, it's fine to just subtract from the out-of-bounds index.

Explanation:

We can think of this as a map from continuous UV coordinates that range in to integer image indices that range in (width) and (height).

• See the previous question's answer for an explanation.
• Note that it's necessary to take the moduli of the floored indices, to get the actual pixel indices for the texture image.

To test if some intersection point is in shadow relative to some light, you must check if there are any objects blocking that light. This can be done by casting a "shadow ray" from towards the light, and checking for intersections between that ray and other objects within the scene.

Suppose point is on object . When casting your shadow ray, do you have to check for intersections between that ray and object ? Why, or why not?