Progress summary I
- Details
- Category: Project Status
- Published on Saturday, 05 March 2016 00:00
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.
Others
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)
TO-DO
Multiple lights
Texture transformations
Cube maps (currently they can be loaded but not shown)
Picking
Infinite grid
Keyframe animations
Bone animations
Instancing
Shadows
HDR
Bloom
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.