Multitexture Renderer

by Aaron Jacobs


My final project for CSC 572 is a rendering utility that supports multitexturing. Scenes are loaded from files, and may contain multiple environments (skybox / environment map), models (.obj meshes), and materials (sets of textures). Rendering properties can be adjusted through the use of a UI that overlays the render.



Surfaces are rendered with five textures taken from a material (diffuse map, specular map, normal map, displacement map, ambient occlusion map) along with two textures taken from the environment (environment map, reflection map).


The diffuse map determines the base surface color. The specular map determines how much specular light is reflected by different parts of the surface. The normal map defines the direction of the surface normals. The displacement map offsets the positions of the mesh's vertices. The ambient occlusion map defines how much ambient light is received by the surface.


The environment map provides ambient lighting information. The surface normal is used to perform a lookup into a cubemap generated from a blurred HDR image of the scene. The reflection map allows for light from the skybox to be reflected by the model. The view direction is reflected about the surface normal, and used as a lookup into the skybox of the scene.

Scene Files

Scenes are loaded from JSON files that specify the environments, models, and materials avaiable to be rendered. Once loaded, all available resources may be switched between using the provided user interface. The included scene contains six environments, four models, and four materials.

User Interface

The user interface was created with Imgui. It allows for rendering properties to be changed in real-time, providing insight into the underlying rendering process. The interactivity gives the potential for the renderer to be used as an educational tool to introduce the concepts of multitexturing.