The following overview and sample video demos provides an idea of the work that Alexandru Ghitescu-Hrin carried as part of his honours project during the 2012-13 academic year. The project consists of a script-driven application designed to aid in real-time graphics programming for beginners and advanced users alike. Titled the eXpandable Procedural Renderer (XPR), the system provides graphics engine functionality designed for current and next generation real-time effects. Interaction with the engine itself can be achieved by simply writing dedicated scripts that can be interpreted and executed in real time.
The distributable version of the engine consists of the XPR executable and the various support libraries that grant access to mathematical functionality, full DirectX 11 support and the Python scripting language. An application designed for XPR needs only to provide a set of Python scripts and the necessary resources for running it such as models, textures and effects. Novice users can rapidly develop a working example in under 50 lines of script while more experienced ones will find that the engine is flexible enough to allow implementation and optimisation of advanced computational and rendering techniques.
XPR can be used as a teaching tool for beginners, an easy development and experimentation tool, a basis for a more complex graphics centric application or even used as a library itself to provide a flexible rendering pipeline for games or visualisation software. While still being generic, it is also heavily optimised and provides easy modular expansion options from the script and source code as well.
The source code, media files and full dependency set needed for development can be checked out from the Google Code XPR repository. In its final form, the resulting software had a development stage that spanned 7 months, totalling over 55,000 lines of code spread across almost 80 classes. The source code successfully grants script access for all texture types and operations DirectX 11 supports, all the available buffer types designed for data storage, transport, shader access and even staging buffers, all primitive types including control point patches and all geometry buffer arrangements including indexing and multiple simultaneous vertex buffers. It enables easy one line use of hardware and shader indexing, facilitates shader bindings and reduces custom binding commands to one flexible line of script code, it provides means of loading custom bit-level data to shaders directly from the script and even allows GPU specific data type conversion.