Add more to writeup

This commit is contained in:
Michael Zhang 2023-02-16 01:14:22 -06:00
parent 0000045030
commit 00000460ab
15 changed files with 203 additions and 67 deletions

View file

@ -7,3 +7,4 @@
*.pdf *.pdf
perf.data* perf.data*
flamegraph.svg flamegraph.svg
showcase.png

View file

@ -7,9 +7,10 @@ ZIP := zip
PANDOC := pandoc PANDOC := pandoc
CONVERT := convert CONVERT := convert
HANDIN := hw1b.michael.zhang.zip HANDIN := ./hw1b.michael.zhang.zip
BINARY := ./raytracer1b BINARY := ./raytracer1b
WRITEUP := writeup.pdf WRITEUP := ./writeup.pdf
SHOWCASE := ./showcase.png
SOURCES := Cargo.toml $(shell find -name "*.rs") SOURCES := Cargo.toml $(shell find -name "*.rs")
EXAMPLES := $(shell find examples -name "*.txt") EXAMPLES := $(shell find examples -name "*.txt")
@ -31,9 +32,12 @@ $(BINARY): $(SOURCES)
cargo build --profile release-handin cargo build --profile release-handin
mv target/docker/release-handin/raytracer1b $@ mv target/docker/release-handin/raytracer1b $@
$(HANDIN): $(BINARY) $(WRITEUP) Makefile Cargo.toml Cargo.lock README.md $(EXAMPLES_PNG) $(EXAMPLES_PPM) $(HANDIN): $(BINARY) $(WRITEUP) Makefile Cargo.toml Cargo.lock README.md $(EXAMPLES_PNG) $(EXAMPLES_PPM) $(SHOWCASE)
$(ZIP) -r $@ src examples $^ $(ZIP) -r $@ src examples $^
$(SHOWCASE): examples/soft-shadow-demo.png
cp $< $@
examples/%.ppm: examples/%.txt $(SOURCES) examples/%.ppm: examples/%.txt $(SOURCES)
cargo run --release -- -o $@ $< cargo run --release -- -o $@ $<
@ -44,4 +48,6 @@ writeup.pdf: writeup.md $(EXAMPLES_PNG)
$(PANDOC) -o $@ $< $(PANDOC) -o $@ $<
clean: clean:
rm -f $(HANDIN) $(BINARY) $(WRITEUP) $(EXAMPLES_PPM) $(EXAMPLES_PNG) rm -rf target/docker \
$(HANDIN) $(BINARY) $(WRITEUP) $(SHOWCASE) \
$(EXAMPLES_PPM) $(EXAMPLES_PNG)

View file

@ -14,6 +14,10 @@ sources, and the ppm files are the corresponding outputs. They have been
generated by running this program. For convenience, pngs have also been provided generated by running this program. For convenience, pngs have also been provided
using imagemagick. using imagemagick.
## Showcase image
The showcase image can be found at `/showcase.png`.
## Building from source ## Building from source
The Makefile currently uses Docker to produce a more consistent build. If you The Makefile currently uses Docker to produce a more consistent build. If you

View file

@ -0,0 +1,15 @@
imsize 640 480
eye -2.5 2 -5
viewdir -0.2 0 -1
hfov 90
updir 0 1 0
bkgcolor 0.4 0.4 0.4
depthcueing 0.4 0.4 0.4 1 0.1 60 0
light 0 5 -7.5 1 1 1 1
mtlcolor 1 0.8 0.7 1 1 1 0.6 0.6 0 10
sphere -5 2 -10 2
sphere -3 2 -20 2
sphere 1.5 2 -30 2
sphere 13 2 -60 2

View file

@ -3,21 +3,21 @@ eye 0 0 15
viewdir 0 0 -1 viewdir 0 0 -1
hfov 90 hfov 90
updir 0 1 0 updir 0 1 0
bkgcolor 0.1 0.1 0.1 bkgcolor 0.4 0.4 0.4
light 0 3 3 0 0.3 0.3 0.4 light 0 5 5 1 0.7 0.7 0.8
mtlcolor 0 1 0 1 1 1 0 0.4 0 1 mtlcolor 0.6 1 0.4 1 1 1 0 0.4 0 1
sphere -10 0 0 2 sphere -10 0 0 2
mtlcolor 0 1 0 1 1 1 0.2 0.4 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.4 0 1
sphere -5 0 0 2 sphere -5 0 0 2
mtlcolor 0 1 0 1 1 1 0.4 0.4 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.4 0.4 0 1
sphere 0 0 0 2 sphere 0 0 0 2
mtlcolor 0 1 0 1 1 1 0.6 0.4 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.6 0.4 0 1
sphere 5 0 0 2 sphere 5 0 0 2
mtlcolor 0 1 0 1 1 1 0.8 0.4 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.8 0.4 0 1
sphere 10 0 0 2 sphere 10 0 0 2

View file

@ -3,21 +3,21 @@ eye 0 0 15
viewdir 0 0 -1 viewdir 0 0 -1
hfov 90 hfov 90
updir 0 1 0 updir 0 1 0
bkgcolor 0.1 0.1 0.1 bkgcolor 0.4 0.4 0.4
light 0 3 3 0 0.3 0.3 0.4 light 0 5 5 1 0.7 0.7 0.8
mtlcolor 0 1 0 1 1 1 0.2 0 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.2 0 0 1
sphere -10 0 0 2 sphere -10 0 0 2
mtlcolor 0 1 0 1 1 1 0.2 0.2 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0 1
sphere -5 0 0 2 sphere -5 0 0 2
mtlcolor 0 1 0 1 1 1 0.2 0.4 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.4 0 1
sphere 0 0 0 2 sphere 0 0 0 2
mtlcolor 0 1 0 1 1 1 0.2 0.6 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.6 0 1
sphere 5 0 0 2 sphere 5 0 0 2
mtlcolor 0 1 0 1 1 1 0.2 0.8 0 1 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.8 0 1
sphere 10 0 0 2 sphere 10 0 0 2

View file

@ -3,21 +3,21 @@ eye 0 0 15
viewdir 0 0 -1 viewdir 0 0 -1
hfov 90 hfov 90
updir 0 1 0 updir 0 1 0
bkgcolor 0.1 0.1 0.1 bkgcolor 0.4 0.4 0.4
light 0 3 3 0 0.3 0.3 0.4 light 0 5 5 1 0.7 0.7 0.8
mtlcolor 0 1 0 1 1 1 0.1 0.2 0 15 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0 15
sphere -10 0 0 2 sphere -10 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.2 15 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.2 15
sphere -5 0 0 2 sphere -5 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.4 15 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.4 15
sphere 0 0 0 2 sphere 0 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.6 15 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.6 15
sphere 5 0 0 2 sphere 5 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.8 15 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.8 15
sphere 10 0 0 2 sphere 10 0 0 2

View file

@ -0,0 +1,16 @@
imsize 640 480
eye 0 0 -2
viewdir 0 0 -1
hfov 90
updir 0 1 0
bkgcolor 0.4 0.4 0.4
light -5 5 -7.5 1 1 1 1
light 5 5 -7.5 1 1 1 1
mtlcolor 0.4 0.6 1 1 1 1 0.2 0.6 0 10
sphere 0 -2 -10 2
mtlcolor 0.8 0.4 0.4 1 1 1 0.2 0.6 0 10
sphere -2.5 2.5 -10 1
sphere 2.5 2.5 -10 1

View file

@ -3,21 +3,21 @@ eye 0 0 15
viewdir 0 0 -1 viewdir 0 0 -1
hfov 90 hfov 90
updir 0 1 0 updir 0 1 0
bkgcolor 0.1 0.1 0.1 bkgcolor 0.4 0.4 0.4
light 0 3 3 0 0.3 0.3 0.4 light 0 5 5 1 0.7 0.7 0.8
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.4 2 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.4 2
sphere -10 0 0 2 sphere -10 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.4 6 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.4 6
sphere -5 0 0 2 sphere -5 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.4 10 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.4 10
sphere 0 0 0 2 sphere 0 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.4 50 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.4 50
sphere 5 0 0 2 sphere 5 0 0 2
mtlcolor 0 1 0 1 1 1 0.1 0.2 0.4 100 mtlcolor 0.6 1 0.4 1 1 1 0.2 0.2 0.4 100
sphere 10 0 0 2 sphere 10 0 0 2

View file

@ -1,37 +1,37 @@
imsize 640 480 imsize 1920 1080
eye 0 0 15 eye 0 0 15
viewdir 0 0 -1 viewdir 0 0 -1
hfov 60 hfov 60
updir 0 1 0 updir 0 1 0
bkgcolor 0.1 0.1 0.1 bkgcolor 0.4 0.4 0.4
depthcueing 0.1 0.1 0.1 1 0.2 100 0 depthcueing 0.4 0.4 0.4 1 0.1 60 0
light -10 10 -3 0 0.8 0.8 0.8 light -10 10 -3 0 0.8 0.8 0.8
light -10 10 -3 1 0.8 0.8 0.8 light -10 10 -3 1 0.8 0.8 0.8
mtlcolor 0 0.5 0.5 1 1 1 0.2 0.4 0 10 mtlcolor 0 0.5 0.5 1 1 1 0.2 0.7 0.2 10
sphere -1 -2 -5 2 sphere -1 -2 -5 2
sphere 3 -5 -1 0.5 sphere 10 -10 -40 1
mtlcolor 0.5 0.5 1 0.4 0.4 0.4 0.2 0.4 0 10 mtlcolor 0.5 0.5 1 0.4 0.4 0.4 0.2 0.7 0.4 10
sphere 1 2 -3 3 sphere 1 2 -3 3
sphere -6 3 -4 1 sphere -6 3 -4 1
mtlcolor 1.0 0 0.5 0.6 0.4 0.2 0.2 0.4 0 10 mtlcolor 1.0 0 0.5 0.6 0.4 0.2 0.2 0.6 0.8 10
sphere 20 20 -50 6 sphere 20 20 -50 6
mtlcolor 0.5 0 0.5 0.6 0.4 0.2 0.2 0.4 0 10 mtlcolor 0.5 0 0.5 0.6 0.4 0.2 0.2 0.5 0 10
sphere -6 -4 -8 7 sphere -6 -4 -8 7
mtlcolor 0.8 0 0.3 0.6 0.4 0.2 0.2 0.4 0 10 mtlcolor 0.8 0 0.3 0.6 0.4 0.2 0.2 0.4 0.2 10
cylinder -2 2 -3 0 0 5 1 4 cylinder -2 2 -3 0 0 5 1 4
mtlcolor 0.8 0.8 0.3 0.6 0.4 0.2 0.2 0.4 0 10 mtlcolor 0.8 0.8 0.3 0.6 0.4 0.2 0.2 0.8 0.2 10
sphere -40 35 -80 7 sphere -40 35 -80 7
sphere -25 20 -60 5 sphere -25 20 -60 5
sphere -12.5 15 -40 3 sphere -12.5 15 -40 3
sphere -6 11 -20 1.5 sphere -7 14 -30 2
mtlcolor 0.5 1 0.5 0.2 0.4 0.8 0.2 0.4 0 10 mtlcolor 0.5 1 0.5 0.2 0.4 0.8 0.2 0.4 0 10
cylinder 5 1 -2 1 -2 1 1 2 cylinder 5 1 -2 1 -2 1 1 2

View file

@ -4,15 +4,16 @@ viewdir 0 0 -1
hfov 60 hfov 60
updir 0 1 0 updir 0 1 0
bkgcolor 0.5 0.5 0.5 bkgcolor 0.5 0.5 0.5
depthcueing 0.5 0.5 0.5 1 0.4 40 20
depthcueing 0.5 0.5 0.5 1 0.4 60 0
light 10 10 -10 1 1 1 1 light 10 10 -10 1 1 1 1
mtlcolor 0.5 1 0.5 1 1 1 0.2 1 0 10 mtlcolor 0.5 1 0.5 1 1 1 0.2 1 0.1 5
sphere 5 5 -20 5 sphere 4.5 4.5 -20 4.5
sphere -5 -5 -20 5 sphere -4.5 -4.5 -20 4.5
mtlcolor 1 0.5 0.5 1 1 1 0.2 1 0 10 mtlcolor 1 0.5 0.5 1 1 1 0.2 0.8 0 5
sphere -10 0 -30 4 sphere -10 0 -30 4
sphere -20 0 -30 4 sphere -20 0 -30 4
sphere -30 0 -30 4 sphere -30 0 -30 4

View file

@ -4,7 +4,7 @@ use ordered_float::NotNan;
use crate::{ray::Ray, utils::min_f64}; use crate::{ray::Ray, utils::min_f64};
use super::{illumination::IntersectionContext}; use super::illumination::IntersectionContext;
#[derive(Debug)] #[derive(Debug)]
pub struct Sphere { pub struct Sphere {
@ -21,9 +21,7 @@ impl Sphere {
&self, &self,
ray: &Ray, ray: &Ray,
) -> Result<Option<IntersectionContext>> { ) -> Result<Option<IntersectionContext>> {
let a = ray.direction.x.powi(2) let a = ray.direction.norm();
+ ray.direction.y.powi(2)
+ ray.direction.z.powi(2);
let b = 2.0 let b = 2.0
* (ray.direction.x * (ray.origin.x - self.center.x) * (ray.direction.x * (ray.origin.x - self.center.x)
+ ray.direction.y * (ray.origin.y - self.center.y) + ray.direction.y * (ray.origin.y - self.center.y)

View file

@ -3,6 +3,7 @@ use nalgebra::{Matrix3, Vector3};
use ordered_float::NotNan; use ordered_float::NotNan;
/// Finds the minimum of an iterator of f64s, ignoring any NaN values /// Finds the minimum of an iterator of f64s, ignoring any NaN values
#[inline]
pub fn min_f64<I>(i: I) -> Option<f64> pub fn min_f64<I>(i: I) -> Option<f64>
where where
I: Iterator<Item = f64>, I: Iterator<Item = f64>,
@ -14,6 +15,7 @@ where
/// Finds the minimum of an iterator of f64s using the given predicate, ignoring /// Finds the minimum of an iterator of f64s using the given predicate, ignoring
/// any NaN values /// any NaN values
#[inline]
pub fn min_f64_by_key<I, F>(i: I, f: F) -> Option<f64> pub fn min_f64_by_key<I, F>(i: I, f: F) -> Option<f64>
where where
I: Iterator<Item = f64>, I: Iterator<Item = f64>,

View file

@ -3,36 +3,118 @@ geometry: margin=2cm
output: pdf_document output: pdf_document
--- ---
# Raytracer part B
This project implements a raytracer with Blinn-Phong illumination implemented. This project implements a raytracer with Blinn-Phong illumination implemented.
The primary formula that is used by this implementation is: The primary formula that is used by this implementation is:
$$ \begin{equation}
I_{\lambda} = k_a O_{d\lambda} + I_{\lambda} =
\sum_{i=1}^{n_\textrm{lights}} \left( k_a O_{d\lambda} +
IL_{i\lambda} \left[ \sum_{i=1}^{n_\textrm{lights}} \left(
k_d O_{d\lambda} \textrm{max} \{ IL_{i\lambda} \left[
% 0, \overrightarrow{N} \middot \vec{L_i} 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]
\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
- $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
## Varying $k_a$ ## Varying $k_a$
![Varying $k_a$](examples/ka-demo.png){width=240px} $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$ ## Varying $k_d$
![Varying $k_d$](examples/kd-demo.png){width=240px} TODO
![Varying $k_d$](examples/kd-demo.png){width=360px}
\
## Varying $k_s$ ## Varying $k_s$
![Varying $k_s$](examples/ks-demo.png){width=240px} TODO
![Varying $k_s$](examples/ks-demo.png){width=360px}
\
## Varying $n$ ## Varying $n$
![Varying $n$](examples/n-demo.png){width=240px} $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 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}
\
## 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 model cannot be used to represent TODO
# Arbitrary Objects # Arbitrary Objects
![Varying $n$](examples/objects.png){width=240px} ![Objects in the scene](examples/objects.png){width=360px}
\

View file

@ -0,0 +1,11 @@
# Participation Question 1
**What are the complications that you can imagine that results from including
the points on the side of the triangle in the triangle or not?**
_Hint: Two triangles that share a border may have problems._
# Participation Question 2
**When d11 \* d22 - d12 \* d12 = 0, the system will have no solution. When might
this happen, and what does it mean?**