screenshot

PBR renderer

In my 2nd year at BUAS, my first project was to make a renderer and implement PBR lighting for PS5 target hardware. This was my first project focused on rendering/graphics.

The goal of this was to get the hang of working with PS5, set-up a basic project and renderer for the target hardware, working with frame debuggers, learn more about model loading and passing mesh and light data to shaders, understanding platform abstractions and strengthen my mathematics by implementing PBR lighting calculations.

There is no repository link due to NDA content.

role icon

Graphics Programmer

team icon

Solo

time icon

8 weeks

platform icon

PlayStation 5

platform icon

Custom Engine

platform icon

TinyGLTF
TinyObj
stb_image

Basic renderer set-up and asset loading

One of the main learning objectives was to get familiar with setting up a basic renderer with a more modern graphics API. My only prior experience was a little bit in OpenGL, so this was still relatively new to me. Since I had to set-up a renderer for PS5 and all of it is under NDA, the learning resources were limited to the official documentation, official sample projects and some samples our university provided us. With this I gradually learned how to more efficiently reverse-engineer from existing code and dig through documentation for the information I needed.

After setting up the project with a basic renderer and my first triangle, my next goal was to load models and light data. For this I used TinyGLTF and TinyObj to load models in GLTF and OBJ formats. Since most models didn't come with any tangents to load, I also learned to calculate tangents from normals and faces. Models with a hierarchical structure were also loaded correctly using a simple transform hierarchy.

To light up the scene, I developed a basic light system which uses one of PS5's platform specific resource type to pass the data to the shaders. This supported directional lights and point lights with attenuation.

PBR lighting

After setting up a renderer with models and materials loading, I researched and implemented PBR lighting. This included implementing core BRDF components including: Lambertian diffuse, Cook-Torrent specular, Fresnel-Schlick and normal distribution. Due to time constraints, I didn't and haven't gotten to implement any form of IBL (yet).

While implementing, I ran into many issues like some model materials being loaded incorrectly even though I thought they did. This was because I made the mistake of not checking if the data I loaded was correct and led me to the discovery of frame debuggers. I learned to capture frames and gradually be more efficient in pin-pointing the problem at hand by looking at the information provided in the debugger's frame capture.

PBR lighting calculation in shader