\usepackage{fullpage}
\usepackage{graphicx}
\usepackage{minted}
+\usepackage{hyperref}
\begin{document}
\title{CS4052 Project - Physically Based Rendering}
\author{Luke Lau 15336810}
\maketitle
-
\section{Physically Based Rendering}
-The project uses a physically based lighting model, which computes per pixel lighting by estimating
-how light rays interact with surfaces at a microscopic level, called the microfacet model.
+This project uses a physically based lighting model, which computes per pixel lighting by estimating
+how light rays interact with surfaces at a microscopic level, known as the microfacet model.
\begin{center}
\includegraphics[width=7cm]{microfacets_light_rays}
reflected back. The latter is used for approximating how metals absorb refracted light without
scattering.
-\begin{center}
-\end{center}
-
There are 7 texture maps used when rendering each material. 4 are defined in the model and 3 are
precomputed at the start of the program.
\begin{minted}{glsl}
The Albedo map provides the base colour underneath the diffuse and specular layers, the normal
map is just a standard normal map, and similarly for the ambient occlusion (ao) map.
-The model in the program is loaded from the GlTF2 format, a trendy new model format designed for
-easy transportation of physically based models and materials, maintained by the Khronos group (the
-same group behind OpenGL and Vulkan).
-Because it is physically based, it defines a metallic roughness map texture.
+The Newton's Cradle is loaded from a GlTF2 model, a trendy new model format designed for PBR materials,
+and is maintained by the Khronos group (the same group behind OpenGL and Vulkan).
+Because it is physically based, the specification expects a metallic-roughness map texture.
The metallic value is stored in the blue channel of the texture whilst the roughness value is stored in the green channel (Inside the source code there is a small python script,
\texttt{metallicRoughness.py} which combines two separate metallic/roughness maps into one suitable
for the GlTF2 format. AssImp recently added partial support for GlTF2 models so I was able to read
crazy to precompute this integral for every single combination of viewing angle and incoming light
angle, so instead this is approximated with the split-sum-approximation\cite{splitsum}. This results
in the equation in figure~\ref{eq:splitsum}, which has two terms: a filter for convoluting
-(\texttt{prefilterfrag.glsl}), and the BRDF equation (\texttt{brdffrag.glsl}).
+(\texttt{prefilterfrag.glsl}), and the bidirectional reflective distribution function (BRDF) (\texttt{brdffrag.glsl}).
+
+The BRDF is a function that takes in the incoming light direction, the outgoing view direction,
+the surface normal and the roughness of the material, and returns how much of the incoming light
+is reflected back at that viewing angle.
\begin{figure}
\begin{equation}
\caption{Normal mapping and ambient occlusion providing depth to the materials.}
\end{figure}
-
\begin{figure}
\centering
\includegraphics[width=\textwidth]{fresnelEffect}
animations via a skeletal bone system, where each vertex has a weight associated with each bone in
the model, affecting how much it is transformed by when the corresponding bone moves.
-The first step of this was to add bones to the model I had created in blender. I created two bones,
+The first step was to add bones to the model I had created in blender. I created two bones,
one for each swinging sphere, and then assigned the vertex weights of the two spheres and the bottom
vertices of the ropes to their respective bones.
-The bones could then be animated using keyframes. By specifying their resting position and apex, I
-could then use Bezier curves to interpolate between them in such a way that gave the appearance of
-momentum. Thankfully, the GlTF2 exporter in Blender bakes the Bezier interpolation between the
-keyframes into many subdivided keyframes, so I was able to just linearly interpolate between them in
-my program.
+The bones could then be animated using keyframes. By specifying the starting and apex, I
+could use Bezier curves to interpolate between them in such a way that gave the appearance of
+momentum. Thankfully, the GlTF2 exporter in Blender bakes the Bezier interpolation into many
+subdivided keyframes, so I was able to just linearly interpolate between them in my program.
\begin{figure}
\centering
with the library, mainly relating to animations. My changes and pull requests for them can be found
here on GitHub:
-https://github.com/assimp/assimp/pull/2243
-https://github.com/assimp/assimp/pull/2244
+\url{https://github.com/assimp/assimp/pull/2243}
+\url{https://github.com/assimp/assimp/pull/2244}
\begin{thebibliography}{9}
\bibitem{splitsum}
Brian Karis, Epic Games,
\textit{Real Shading in Unreal Engine 4}, \\
- https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf
+ \url{https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf}
\end{thebibliography}
\end{document}