Fusion Frame engine is a framework type game engine that focuses on delivering a compact and easy-to-use interface for 3d game development while preserving speed. It also supports different physics algorithms to speed up the game development. It utilizes OpenGL as the graphics API.
- Deferred rendering(soon to be clustered deferred as well as forward+ as an option)
- Omnidirectional shadows for point lights
- Linear shadows for directional lights
- PBR-IBL shading
- HDRI and cubemap support
- Deferred and forward mesh instancing
- Compute shader based particle emitter
- Skeletal animation support
- Deferred ScreenSpace decals
Also planning to implement a voxel based GI soon.
- Oct/Quad tree for general object class
- Half-edge mesh structure
- Easy collision mesh creation from meshes and bounding boxes
- AABB and SAT collisions
Also using half-edge data structure , wrote couple of premature mesh algorithms like subdivision for triangular meshes. Mesh utility algorithms like quickhull to create collision boxes are also in the TO-DO list
It has a monte-carlo path tracer that's compatible with rest of the engine. Path tracing is done on a compute shader using a hybrid BVH(top and bottom) for acceleration. Currently the BVH construction done on the CPU but GPU based construction is in the bucket list for the future. The estimator can sample emissive lights using NEE(Next Even Estimation) and the analytical lights used in the rastered scenes alike.
Here are quick demo scenes. Scenes don't belong to me.
The overall API is pretty simple and user friendly. I'll try to demonstrate some of the functionality to get you started
- Initializing the window and the resources
const int width = 1000;
const int height = 1000;
FUSIONCORE::Window ApplicationWindow;
ApplicationWindow.InitializeWindow(width, height, 4, 6, false, "FusionFrame Engine");
FUSIONUTIL::InitializeEngineBuffers();
FUSIONUTIL::DefaultShaders Shaders;
FUSIONUTIL::InitializeDefaultShaders(Shaders);
- Importing a HDRI
FUSIONCORE::CubeMap cubemap(*Shaders.CubeMapShader);
FUSIONCORE::ImportCubeMap("Resources/rustig_koppie_puresky_2k.hdr", 1024, cubemap, Shaders);
- Engine supports both deferred and forward rendering so you can use a gbuffer to use deferred rendering.
const FUSIONUTIL::VideoMode mode = FUSIONUTIL::GetVideoMode(FUSIONUTIL::GetPrimaryMonitor());
FUSIONCORE::Gbuffer Gbuffer(mode.width, mode.height);
FUSIONCORE::FrameBuffer ScreenFrameBuffer(mode.width, mode.height);