Some time ago I began to write a little ray tracer based on the book “Raytracing from the Ground Up“. The book proved to be very easy to follow and before I knew it I had a little program that could generate images. I continued to push the rendering engine until I was able to get several interesting images. The project was hosted on google code and a blog for the raytracer was hosted on blogspot. Here are some of the images i was able to generate with it.
Eventually I wanted to implement more features into the renderer, but as I went through the code I realized that it was very messy and hard to extend, even though I had used objects (C++) to write the code. I started to read other rendering books and I decided to have another go at the renderer. This time I would start from scratch but I would build a plugin based system. I would concentrate on building a core rendering engine, a rendering API for describing scenes and a plugin API to extend the renderer as needed.
I began to read on how to implement a plugin architecture and a lot of the information I found mentioned that it is better to implement the plugin part in C and combine the code with C++. I began to talk with several co-workers about how to approach this project. Slavomir Kaslev, a very talented developer at Blizzard Cinematics, convinced me to write the whole system in C. I analyzed his proposal and even though I knew that C++ and objects would make things a bit easier, learning C is something that has been on my list for a long time.
So straight C it is! Boy what a decision it turned out to be. I was immediately amazed with how much “magic” languages such as C++ and Python perform behind the scenes to make the developers life easier. I decided to merge different concepts from different renderers and books I have read. I liked the Arnold C API and their node based approach. Being that my renderer would also be C, Arnold proved a good inspiration for the API. Since I dont have source code access to Arnold, and even if I did I would not want to use it ( that work belongs to Marcos and Solid Angle ), I decided to use PBRT as a base for most of the calculations, but at one point I would try to get away from the “physical” aspect of it and try to develop different integration and rendering methods.
It took me a lot of work, a lot of errors and a good deal of consults with my C mentors to get to a point where I could generate an image. At the moment I am still working on the plugin API, trying to decide what goes where. In the mean time here is the first image generated with Equinox.