Antonios Gogios
Software Engineer
My 3D Engine Project
2009 - 2016
A long-term project I personally undertook (currently discontinued due to lack of available time), whose challenges and associated difficulties have granted me with extensive software development experience. Performance and scalability are considered very important goals for it, shaping development choices accordingly.
Click the engine's architectural diagram if you want to see
a larger version.
Below, you can find an overview of the engine's current features.

Current Features Overview

Real-time Renderer: Main Features
● Blinn-Phong Shading Model
● Normal Maps
● Specular Maps
● Skybox
● Alpha-masking
● Real-time Shadows (depthmap)
The engine's real-time renderer is compliant with the Blinn-Phong shading model and its shaders support normal maps, spec maps and alpha-masked materials. Dynamic lights (directional, point, spot) are also implemented, along with real-time depthmap shadows. Skyboxes are also supported.

Batch-based Draw Calls
Draw calls are kept at a minimum by batching them and minimizing render state changes and GPU updates (for material properties, etc). Instanced 3D objects are first grouped by render context, then by material, and finally sorted in front-to-back order to reduce overdraw. Also, objects with opaque materials naturally take precedence over non-opaque ones during the rendering of each frame.

Collision Detection
Static collision detection has been implemented, allowing objects to be assigned both parametric and polygonal collision volumes, as desired. The volumes supported so far are:
● Spheres
● Capsules
● Planes
● Axis-Aligned Bounding Boxes (AABBs)
● Oriented Bounding Boxes (OBBs)
● Arbitrary triangle meshes (i.e. a triangle polygon soup)
To see a demonstration of collision detection at work, see the 3D Math Library Demo.
AI path-finding and path network generation
The engine's AI module receives the path nodes and obstacles for a 3D scene or level and generates a path network that is traversable by the AI agents. The engine is then able to compute the shortest path between any two positions. Path nodes can also store user-defined attributes (as bit-flags), allowing the embedding of useful domain-specific information that can influence the decisions of the AI agents while in-game.


Level Streaming
A 3D scene or level of the engine is composed of multiple independent sectors. They can be independently loaded while in in-game mode, driven by the camera's position approaching them. Each sector's 3D content is enclosed in a collision volume. By making the sectors' volumes partially overlap, the adjacent sector can be loaded as the player approaches, and continuous movement achieved, in an open-world-like fashion. Similarly, sectors that are exited (and the camera position is no longer contained in their volume) can be removed, releasing system resources for other uses.
FPS Limiter
A simple but very useful feature, the FPS (frames per second) limiter allows skipping the rendering of unecessary frames. By setting the FPS upper limit to a value beyond which the human eye cannot distinguish the difference (e.g. 60 frames/sec), additional frames are not rendered, and valuable system resources are preserved. As a consequence, the responsiveness of the system increases exponentially, as demonstrated in the comparative measurements shown on the right (this chart is from my MSc dissertation).


Custom File Formats for 3D Assets
For performance as well as flexibility reasons, the 3D assets are pre-processed during export and converted from COLLADA into custom file formats that better represent the data structures employed by the engine. The file formats are designed with performance as the main consideration, so that the engine can coherently read the data in a single pass and then be able to directly copy it on a GPU buffer with no need to pre-process the imported data further.