Having written a program in my spare time at University that allowed users to write and view shaders in real time, whilst using the program to create a normal map style shader I found that the resulting normal map was inaccurate. As a result, for my final year project I decided to create a tool to generate functional normal maps for and from existing albedo textures, targeted at artists and indie developers.
To enable easy portability to different platforms and fast running times I used C++ and OpenGL. As I believe it is important to fully understand how the underlying technologies perform and function, I did not want to use too many external libraries. In addition, I was striving to ensure the application did not become bloated.
The program used two windows, one with instructions the other with a preview of the normal map. The user could import a texture, then once selected, the normal map for that texture would appear in the preview window. This was generated using a fragment shader. The algorithm itself treated the input image as a height map using the average of the 3 colour channels as height values. The code I wrote implemented an existing algorithm designed for a visual programming scripting language for Unity.
The design process was iterative and to evaluate the maps it produced I interviewed potential users about their experiences of the program and their preferences for the materials that used normal maps made with my own program, versus those that used maps generated by an existing program. With this feedback I made changes to my algorithm to improve the contrast in the normal maps.
If you would like to read my honours dissertation, it can be found here
Recently I went back to this project to implement the automated levelling that I talk about in my dissertation. You can read about it here
Currently I am attempting to recreate this project using Vulkan so that it is modernised and more efficient.
