remove writeup and showcase
This commit is contained in:
parent
2fba7fcdc5
commit
c254570c02
2 changed files with 2 additions and 183 deletions
|
@ -10,8 +10,6 @@ CONVERT := convert
|
|||
|
||||
HANDIN := ./hw1c.michael.zhang.zip
|
||||
BINARY := ./raytracer1c
|
||||
WRITEUP := ./writeup.pdf
|
||||
SHOWCASE := ./showcase.png
|
||||
SOURCES := Cargo.toml $(shell find -name "*.rs")
|
||||
|
||||
EXAMPLES := $(shell find examples -name "*.txt")
|
||||
|
@ -33,22 +31,16 @@ $(BINARY): $(SOURCES)
|
|||
cargo build --profile release-handin
|
||||
mv target/docker/release-handin/raytracer1c $@
|
||||
|
||||
$(HANDIN): $(BINARY) $(WRITEUP) Makefile Cargo.toml Cargo.lock README.md $(EXAMPLES_PNG) $(EXAMPLES_PPM) $(SHOWCASE)
|
||||
$(HANDIN): $(BINARY) Makefile Cargo.toml Cargo.lock README.md $(EXAMPLES_PNG) $(EXAMPLES_PPM)
|
||||
$(ZIP) -r $@ src examples $^
|
||||
|
||||
$(SHOWCASE): examples/soft-shadow-demo.png
|
||||
cp $< $@
|
||||
|
||||
examples/%.ppm: examples/%.txt $(SOURCES)
|
||||
cargo run --release -- -o $@ $(RAYTRACER_FLAGS) $<
|
||||
|
||||
examples/%.png: examples/%.ppm
|
||||
convert $< $@
|
||||
|
||||
writeup.pdf: writeup.md $(EXAMPLES_PNG)
|
||||
$(PANDOC) -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -rf target/docker \
|
||||
$(HANDIN) $(BINARY) $(WRITEUP) $(SHOWCASE) \
|
||||
$(HANDIN) $(BINARY) \
|
||||
$(EXAMPLES_PPM) $(EXAMPLES_PNG)
|
||||
|
|
|
@ -1,173 +0,0 @@
|
|||
---
|
||||
geometry: margin=2cm
|
||||
output: pdf_document
|
||||
---
|
||||
|
||||
# Raytracer part B
|
||||
|
||||
This project implements a raytracer with Blinn-Phong illumination and shadows
|
||||
implemented. The primary formula that is used by this implementation is:
|
||||
|
||||
\begin{equation}
|
||||
I_{\lambda} =
|
||||
k_a O_{d\lambda} +
|
||||
\sum_{i=1}^{n_\textrm{lights}} \left(
|
||||
f_\textrm{att} \cdot
|
||||
S_i \cdot
|
||||
IL_{i\lambda} \left[
|
||||
k_d O_{d\lambda} \max ( 0, \vec{N} \cdot \vec{L_i} ) +
|
||||
k_s O_{s\lambda} \max ( 0, \vec{N} \cdot \vec{H_i} )^n
|
||||
\right]
|
||||
\right)
|
||||
\end{equation}
|
||||
|
||||
Where:
|
||||
|
||||
- $I_{\lambda}$ is the final illumination of the pixel on an object
|
||||
- $k_a$ is the material's ambient reflectivity
|
||||
- $k_d$ is the material's diffuse reflectivity
|
||||
- $k_s$ is the material's specular reflectivity
|
||||
- $n_\textrm{lights}$ is the number of lights
|
||||
- $f_\textrm{att}$ is the light attenuation factor (1.0 if attenuation is not on)
|
||||
- $S_i$ is the shadow coefficient for light $i$
|
||||
- $IL_{i\lambda}$ is the intensity of light $i$
|
||||
- $O_{d\lambda}$ is the object's diffuse color
|
||||
- $O_{s\lambda}$ is the object's specular color
|
||||
- $\vec{N}$ is the normal vector to the object's surface
|
||||
- $\vec{L_i}$ is the direction from the intersection point to the light $i$
|
||||
- $\vec{H_i}$ is halfway between the direction to the light $i$ and the
|
||||
direction to the viewer
|
||||
- $n$ is the exponent for the specular component
|
||||
|
||||
In this report we will look through how these various factors influence the
|
||||
rendering of the scene. All the images along with their source `.txt` files,
|
||||
rendered `.ppm` files, and converted `.png` files can be found in the `examples`
|
||||
directory of this handin.
|
||||
|
||||
## Varying $k_a$
|
||||
|
||||
$k_a$ is the strength of ambient light. It's used as a coefficient for the
|
||||
object's diffuse color, which keeps a constant value independent of the
|
||||
positions of the object, light, and the viewer. In the image below, I varied
|
||||
$k_a$ between 0.2 and 1. Note how the overall color of the ball increases or
|
||||
decreases in brightness when all other factors remain constant.
|
||||
|
||||
![Varying $k_a$](examples/ka-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Varying $k_d$
|
||||
|
||||
$k_d$ is the strength of the diffuse component. It also affects an object's
|
||||
diffuse color, but at a strength that's affected by how much of it faces the
|
||||
light. Much like the dark side of the moon, the parts of the object that aren't
|
||||
pointed at the light will not receive as much of the light's influence. In the
|
||||
image below, I varied $k_d$ between 0.2 and 1. Note how the part pointed to the
|
||||
light changes the strength of the brightness as all other factors remain
|
||||
constant.
|
||||
|
||||
![Varying $k_d$](examples/kd-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Varying $k_s$
|
||||
|
||||
$k_s$ is the specular strength. It uses the object's specular color, which is
|
||||
like its reflective component. When there is a large specular $k_s$, there's a
|
||||
shine that appears on the object with a greater intensity. In the image below, I
|
||||
varied $k_s$ between 0.2 and 1. Note how the whiteness of the light is more
|
||||
reflective in higher $k_s$ values as other factors remain constant.
|
||||
|
||||
![Varying $k_s$](examples/ks-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Varying $n$
|
||||
|
||||
$n$ is the exponent saying how big the radius of the specular highlight should
|
||||
be. In the equation, increasing the exponent usually leads to smaller shines. In
|
||||
the image below, I varied $n$ between 2 and 100. Note how the size of the shine
|
||||
is the same intensity, but more focused but covers a smaller area as $n$
|
||||
increases.
|
||||
|
||||
![Varying $n$](examples/n-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Multiple lights
|
||||
|
||||
Multiple lights are handled by multiplying each light against an intensity
|
||||
level, and then added together. Unfortunately, this means that the intensity of
|
||||
each light can't be too bright. We rely on the image to not use lights that are
|
||||
too bright. Because this may result in color values above 1.0, the final value
|
||||
is clamped against 1.0. Below is an example of a scene with two lights; one to
|
||||
the left and one to the right:
|
||||
|
||||
![Multiple lights](examples/multiple-lights-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Shadows
|
||||
|
||||
Shadows are implemented by pointing a second ray between the intersection point
|
||||
of the original view ray and each light. If the light has something obstructing
|
||||
it in the middle, the light's effect is not used.
|
||||
|
||||
The soft shadow effect is realized by jittering rays across an area. In my
|
||||
implementation, a jitter radius of about 1.0 is used, and 75 rays are shot into
|
||||
uniformly sampled points within that radius. This also has the side effect that
|
||||
rays that are closer to the original ray are sampled more frequently. Each of
|
||||
these rays produces either 0 or 1 depending on if it was obstructed by the
|
||||
object. Taking the proportion of rays that hit as a coefficient for the shadow,
|
||||
we can get some soft shadow effects like this:
|
||||
|
||||
![Soft shadows](examples/soft-shadow-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Light attenuation
|
||||
|
||||
Light attenuation is when more of the light is applied for objects that are
|
||||
closer to a particular light source. The function that's applied is an inverse
|
||||
quadratic formula with respect to the distance the object is from the light:
|
||||
|
||||
\begin{equation}
|
||||
f_\textrm{att}(d) = \frac{1}{c_1 + c_2 d + c_3 d^2}
|
||||
\end{equation}
|
||||
|
||||
Where:
|
||||
|
||||
- $f_\textrm{att}$ is the attenuation factor
|
||||
- $d$ is the distance the object is from the light
|
||||
- $c_1$, $c_2$, and $c_3$ are user-supplied coefficients
|
||||
|
||||
As you can see below, the effect of the light drops off with the distance from
|
||||
the light (light coming from the left):
|
||||
|
||||
![Light attenuation](examples/attenuation-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Depth Cueing
|
||||
|
||||
Depth cueing is when the objects further from the viewer have a lower opacity to
|
||||
"fade" into the background in some sense. A good example of this can be seen in
|
||||
the image below; note how the objects are less and less bright the further they
|
||||
are away from the eye.
|
||||
|
||||
![Depth cueing](examples/depth-cueing-demo.png){width=360px}
|
||||
\
|
||||
|
||||
## Shortcomings of the model
|
||||
|
||||
The Phong formula is just a model of how light works, and doesn't actually
|
||||
represent reality. There's not actually rays physically escaping our eyes and
|
||||
hitting objects; it's actually the other way around, but computing it that way
|
||||
would not be efficient since we would be factoring in a lot of rays that don't
|
||||
ever get rendered.
|
||||
|
||||
Also, one needs to take care to use reasonable constants. For example, if using
|
||||
a different specular light color than the diffuse color, then it may produce
|
||||
some bizarre lighting effects that may not actually look right compare to
|
||||
reality.
|
||||
|
||||
# Arbitrary Objects
|
||||
|
||||
Here is an example scene with some objects that demonstrates some of the
|
||||
features of the raytracer.
|
||||
|
||||
![Objects in the scene](examples/objects.png){width=360px}
|
||||
\
|
Loading…
Reference in a new issue