Progress summary I

One year has passed since the Phase 3 ended. I have been working all this time in a 3D engine prototype that will eventually help to design the actual 3D engine to be published along with the rest of libraries of Quimera Engine. It is not finished yet but I wanted to stop for a moment and look back to have an idea of how much distance did I advance. This post is just a summary of all the features implemented until now, although a pending feature list will be shown at the end too.

Currently, the engine is based upon Open GL 4.5 (DSA functions, GLSL 4.5, SSBOs, #includes in shaders, std430 layout, program pipelines, glBlitNamedFramebuffer, glClearTexImage, etc.) although every interface, enumeration and data structure has been designed in such a way that switching to DX11 is quite straightforward. The approach used to design the main components has been a mixture of OOP and DOD, depending on the case; let's say that data is organized as SOAs in memory, but is accessed through class methods, indirectly. As a convention, for now, it is left-handed, row-major and the 2D origin is at the bottom-left corner. The intention is to use as less different shaders as possible, so ideally there would be only 1 shader to calculate all the possibilities (in practice, this does not happen), although it is possible to change the current shader at any moment if the input data structure is the same.

Following, main features are presented in the order they were implemented:

Loading 3D models and textures with ASSIMP and STB

As a future step, the engine will use its own format and ASSIMP will be moved to a custom conversion tool. Stb is used for loading RGB and RGBA images (not compressed).


Oct-trees + OBB + Frustum

Currently the oct-tree is used to filter the entities whose bounding box is inside the current camera's frustum, before rendering. The scene oct-tree is updated every frame so depending on the transformations of the dynamic entities' bounding boxes, only cells that contain an entity are enabled, as can be seen in the image.


Loading DDS compressed textures

The parser supports BC1, BC2, BC3, BC4 and BC5 compression formats. It will support BC6H and BC7 in the future.


Deferred Rendering

The G-Buffer contains 7 textures: Positions, Normals, Albedo color, Specular color (rgb) + specular diffusion (a), Tangents (xyz) + specular power (w), Bitangents and Emissive color. Blinn-Phong ligthing used.


Normals, tangents and bitangents visualization


Self-shadowed parallax occlusion mapping (deferred rendering)

These 2 images show a quad (2 triangles) using a normal map with parallax occlusion enabled.


DTX5 normal maps supported

In the image, normal mapping is enabled in the left and disabled in the right.


2.5D engine and Text rendering using FreeFont and a font atlas. Dead Reckoning signed distance fields

2D entities are shown as 3D quads generated in the geometry shader, facing an orthographic camera. 2D entities scale with the window, optionally. The SDF technique can be applied to any monochrome image (opacity map), as can be seen in the last image of this section. Available effects are: parallel shadows (color, distance, blurring), glowing (color, softness, radius), antialiasing (amount) and outlining (width, color, softness). It is also possible to use any texture or combination of textures as inner color. Text can be wrapped into a rectangle (different modes) and transformed as any other 2D entity.


Transparency using Blended-Weighted OIT algorithm (no back-to-front polygon ordering)

This technique requires forward rendering, at the moment.



Multi-texturing: Up to 8 textures can be stacked and blended for each component (diffuse maps, specular maps, normal maps, etc.).

Reoriented normal mapping: This is the technique used to blend normal maps.

Gamma correction

SMDI textures supported

Keyboard and mouse inputs (some advanced features)

Window management (resizing, fullscreen)



Multiple lights

Texture transformations

Cube maps (currently they can be loaded but not shown)


Infinite grid

Keyframe animations

Bone animations





Ambient occlusion

Fresnel lighting + BRDF

Clustered lights

Blurring (postprocess)

Depth of field

Level of detail

Own binary format for assets and converter

Assets hot-loading

Light texture projection

LUA interface

Particle systems with OpenCL


The list is as long as exciting. It will take another year for sure, at least, since I have to work in my spare time, but I am not in a hurry anyway.



Add comment

Security code