Castor3D (C++)

Description

Castor3D est un moteur 3D écrit en C++17.
Il fonctionne sur les plateformes GNU/Linux (GTK) et Windows.
Il utilise Vulkan comme API de rendu.

Fonctionnalités

  • Deferred rendering pour les objets opaques
  • Weighted Blended rendering pour les objets transparents.
  • Normal mapping.
  • Parallax Occlusion Mapping.
  • Shadow Mapping (avec choix entre Raw, PCF ou Variance Shadow Maps).
  • Screen Space Ambiant Occlusion (en utilisant le Scalable Ambient Obscurance).
  • Reflection/Refraction Mapping.
  • Rendu PBR (Hybride Metallic/Specular/Roughness) et rendu Phong/Blinn-Phong.
  • Rendu HDR avec application de divers opérateurs de Tone Mapping.
  • Screen Space Subsurface Scattering (sans la backlit transmittance pour l'instant).
  • Volumetric Light Scattering, pour la source lumineuse directionelle.
  • Illumination Globale, via les Light Propagation Volumes ou le Voxel Cone Tracing, au choix.
  • Frustum culling.
  • Graphe de scène.
  • Graphe de rendu.
  • Architecture modulaire, à base de plug-ins.
  • Génération automatique de shaders, en fonction de la configuration de la passe.
  • Les shaders peuvent être écrits directement depuis le code C++.
  • Scènes décrites dans un format texte facilement compréhensible et extensible.
  • Rendu synchrone ou asynchrone.
  • Utilisation de Mesh et Task shaders, si disponibles.

Plug-ins implémentés

Importers

Les plug-ins de type Importer permettent l'ajout de l'importation de nouveaux formats de fichiers de maillages.
Sont actuellement implémentés :
  • ASSIMP, utilisant la bibliothèque assimp pour l'import d'une grande variété de formats.

PostEffects

Les plug-ins PostEffect permettent l'application d'effets post-rendu.
Sont implémentés pour l'instant :
  • Bloom: une implémentation de HDR bloom.
  • FilmGrain: ajoute un grain au rendu.
  • GrayScale.
  • LightStreaks: effet utilisant les Kawase Light Streaks.
  • FXAA: un antialisaing de mauvais qualité, mais rapide.
  • SMAA: un antialiasing de bonne qualité, mais plutôt ,lent (1X et T2X jusqu'à présent).
  • Linear Motion Blur.
  • DrawEdges : Détecte et dessine les bordures, basé sur les normales, la profondeur, et/ou l'ID d'objet.
  • PbrBloom : une implémentation de PBR Bloom.

Generators

Les plug-ins de type Generator permettant de générer des maillages ou textures, de manière procédurale.
Pour l'instant un seul plug-in de ce type est implémenté :
  • DiamondSquareTerrain: génère des terrains en utilisant l'algorithme diamond square.

Generics

Les plug-ins de type Generic ont pour but d'étendre les fonctionnalités globales du moteur.
Sont implémentés pour l'instant :
  • CastorGui: étend les fichiers de scène pour ajouter et dessiner des IHM (boutons, zones de texte, ...) via les incrustations 2D.
  • ToonMaterial : Un ensemble de matériaux toon, à combiner avec le plugin DrawEdges.
  • FFTOceanRendering : Permet le rendu d'océan en se basant sur les transformées de Fourier.
  • OceanRendering : Rendu basique d'océan, en spécifiant les propriétés des vages.
  • WaterRendering : Rendu de surfaces planes d'eau, basé sur l'utilisation de normal maps.
  • AtmosphereScattering : Implémentation de rendu de ciel et d'atmosphère.

ToneMappings

Les plug-ins de type ToneMapping permettent de définir de nouveaux opérateurs de tone mapping.
Sont implémentés les opérateurs suivants :
  • Linear: l'opérateur par défaut.
  • Haarm Pieter Duiker.
  • Hejl Burgess Dawson (aussi appelé Filmic).
  • Reinhard.
  • Uncharted 2.
  • ACES.

Autres applications

En plus du moteur et des divers plug-ins, le projet est accompagné de diverses applications :
  • CastorViewer, visualiseur de scènes utilisant Castor3D.
  • ImgConverter, projet de conversion de tout type d'images vers XPM ou ICO.
  • CastorMeshConverter : Convertisseur de divers formats de fichier de maillaige vers le format Castor3D.
  • CastorMeshUpgrader : Met à jour les fichiers de maillage utilisant un format Castor3D antérieur à la dernière version.
  • HeightMapToNormalMap : Convertit une height map en normal map.

Documentation

La documentation du projet est contenue dans les headers et peut être générée via Doxygen.
Le projet en lui-même est compilable sur les plateformes supportées en utilisant CMake.

Exemples


Version 0.14.0

Date : 21/11/2022

Fonctionnalités

  • Ajout du support de changement d'unité de longueur du moteur.
  • Ajout de la personnalisation des passes de rendu du fond.
  • Ajout du support de mélange des matériaux multi-passes.
  • Refonte complète de Pass, en introduisant des PassComponent, pour une meilleure flexibilité.
  • Implémentation du support complet des matériaux glTF et de leurs extensions.
    Attenuation Clearcoat Sheen Iridescence Transmission
  • Implémentation d'atmosphere scattering
    Atmosphere Scattering, Clouds, Island Atmosphere Scattering Atmosphere Scattering Surface
  • Amélioration pour DiamondSquareTerrain, ajout du mode île, et support des biomes.
    Terrain coloré Terrain texturé avec gestion des pentes et des biomes.
  • Suppression du plugin PlyImporter.
  • Implémentation du PBR Bloom, effectuant un bloom sur l'image complète.
    PBR Bloom


Version 0.13.0

Date : 08/06/2022

Fonctionnalités

  • Amélioration drastique des performances.
  • Implémentation des mesh et task shader, avec frustum culling et backface culling.
  • Refonte de l'import des données externes (meshes, skeletons, animations).
  • Implémentation des morph target animations, en remplacement des per-vertex animations.
  • Ajout du support de multiples sets de coordonnées de textures (jusqu'à 4).
  • Ajout des couleurs de sommets.
  • Fusion des deux workflows de PBR implémentés en un hybride, plus flexible par rapport à l'import de scènes externes.


Version 0.12.0

Date : 20/03/2022

Fonctionnalités

  • Utilisation de RenderGraph pour la construction du frame graph.
    Le graphe de voxellisation de la scène, généré par RenderGraph.
  • Utilisation des bindless textures.
  • Utilisation du MultiDrawIndirect pour le dessin des objets de la scène.
  • Implémentation d'un écran de chargement.
  • Implémentation des animations de textures (tile maps et transformations).
  • Implémentation des animations de scene nodes.
  • Ajout du plugin DrawEdges, pour détecter et dessiner les bordures.
    DrawEdges
  • Implémentation d'un plugin de rendu d'eau sur surface plane.
  • Implémentation d'un plugin de rendu basique d'océan.
  • Implémentation d'un plugin de rendu d'océan basé sur les transformées de Fourier.
  • Implémentation d'une collection de matériaux toon.
    Pufi
  • Ajout d'un plugin de tone mapping ACES.
  • Ajout de l'application HeightMapToNormalMap.


Version 0.11.0

Date : 19/02/2021

Fonctionnalités

  • Castor3D s'appuie maintenant sur Ashes, permettant le support des API Vulkan, OpenGL et Direct3D11.
  • GlslWriter a été complètement supprimé et remplacé par ShaderWriter, permettant l'export des shaders dans le langage shader natif pour l'API de rendu choisie.
  • Ajout du support des cross skyboxes.
  • Le contrôle du filtrage anisotropique a été ajouté aux scene files.
  • Ajout du choix du type de shadow map (Raw, PCF ou VSM).
  • Ajout d'une fonction sendEvent à Engine, pour l'exécuter directement si un device est actif.
  • Extraction des fonctions de lecture/écriture binaire/texte dans de nouveaux fichiers, pour réduire les dépendances d'inclusion.
  • Revue de la gestion des mipmaps pour les images chargées depuis un fichier.
  • Ajout du volumetric light scattering.
    Volumetric Light Scattering
  • Les meshes peuvent maintenant avoir un matériau par défaut, dans les scene files, permettant de réduire leur taille.
  • RenderQueue utilise maintenant un SceneCuller, permettant de spécialiser le mode de culling voulu (aucun ou frustum, pour l'instant).
  • Les Cascaded shadow maps sont implémentées pour les sources lumineuses directionnelles.
    Cascaded Shadow Maps
  • Les incrustations sont maintenant dessinées dans leur propre framebuffer, puis celui-ci est combiné avec le rendu 3D.
  • Les Shadow maps utilisent maintenant des texture arrays (2D ou Cube).
  • Implémentation de global illumination via les Light Propagation Volumes.
    Park avec LPV San Miguel avec LPV
  • Implémentation de global illumination via le Voxel Cone Tracing.
    Sponza VCT Park + VCT
  • Implémentation des animations de texture (rotation et translation des UV).
  • Created LinearMotionBlur post effect.
  • ShaderDialog affiche maintenant tous les shaders pour le pipeline utilisé dans l'affichage d'une passe.


Version 0.10.0

Date : 30/12/2017

Fonctionnalités

  • Renommage du namespace Castor3D en castor3d.
  • La composante émissive des matériaux est maintenant stockée sur un simple flottant (les textures d'émissive sont cependant toujours en couleur).
  • Le Physical Based Rendering a été implémenté, en metallic/roughness et specular/glossiness.
    Comparaison PBR/SSR
  • RenderPipeline contient maintenant le programme shader.
  • Le Screen Space Subsurface Scattering a été implémenté (sans la transmission via les faces arrières, cependant).
    Sans SSSSS Avec SSSSS Comparaison d'un détail
  • Le résultat de la passe d'éclairage est maintenant stocké dans deux cibles de rendu : une pour l'éclairage diffus, et une pour la réflexion spéculaire.
  • Les tampons de sommets sont maintenant alloués via un pool utilisant un buddy allocator.
  • Le shadow mapping utilise maintenant des variance shadow maps.
  • Les maillages transparents sont maintenant dessinés en utilisant du Weighted Blended OIT.
  • Le Screen Space Ambiant Occlusion a été amélioré, en implémentant le Scalable Ambiant Obscurance.
    Comparaison SSAO
  • Le Parallax Occlusion Mapping a été implémenté.
    Parallax Occlusion Mapping
  • Implémentation des reflection et refraction maps.
    Réflexion and Réfraction
  • Le rendu différé a été complètement intégré au rendu, pour le rendu des objets opaques.
  • Création de compopsants pour les sous-maillages, afin d'alléger la classe Submesh, et rendre son remplissage plus flexible
  • Le rendu utilise maintenant un pré-passe de profondeur.
  • Créé la classe ColourSkybox, afin de gérer la couleur de fond et les skybox de la même manière.
  • Création d'une classe ShaderBuffer, permettant de manipuler les TBO et SSBO de la même manière, et de choisir le plus approprié en fonction du GPU.
  • Création d'un plugin de génération de terrain en utilisant l'algorithme Diamond Square.
    Diamond Square terrain
  • Les évènements générés depuis CastorGUI sont maintenant envoyés à l'utilisateur.
  • Suppression de la quasi totalité des plugins d'import, ne gardant que Assimp, OBJ et PLY.
  • Création d'un plugin post rendu : SMAA, pour un antialiasing digne de ce nom.
    SMAA comparison
  • Créé un plugin implémentant l'effet Kawase Light Streaks.
    Kawase Light Streaks
  • Création d'un plugin affichant un effet de grain filmique.
  • Suppression de tous les plugins de Technique.
  • Création de l'opérateur de tone mapping Uncharted 2.

Corrections de bugs

  • Correction des bounding boxes pour les maillages animés par vertex, et par squelette.
  • Réparation et réactivation du frustum culling.
  • Réparation de l'alpha rejection.

Téléchargements



Version 0.9.0

Date : 26/03/2017

Fonctionnalités

  • Revue complète de la boucle de rendu : RenderPipeline n'est désormais plus une instance unique, il contient maintenant toutes les informations nécessaires au rendu d'un type d'objet (états, programme, liaisons avec les UniformBuffers, ...).
  • Le rendu a été dispatché dans des RenderPass, qui ont chacune une ou plusieurs RenderQueues, qui sont mises à jour de manière asynchrone sur le CPU, en utilisant un pool de threads. Cela permet à la boucle GPU d'être débarassée de la plupart des calculs CPU.
  • Ajout des Skybox.
  • L'export binaire a été complètement repensé, pour utiliser un format par chunk de données (comme LWO ou 3DS). Il est utilisé pour les maillages et les squelettes.
  • Implémentation des algorithmes de brouillard basiques (linéaire, exponentiel et exponentiel au carré).
  • Ajout du support des animations de type morphing (par sommet).
  • Implémentation du frustum culling.
  • Implémentation d'une passe de Colour picking.
  • Implémentation du shadow mapping, les sources lumineuses peuvent produire des ombres, et les objets peuvent projeter et/ou recevoir des ombres.
  • Implémentation d'un système de particules, laissant à l'utilisateur le choix de l'implémentation (CPU au travers de la surcharge de classes, GPU via le Transform Feedback ou via les Compute Shaders).
  • Correction des équations de calcul d'éclairage en GLSL, ainsi que de la gestion des sources lumineuses (orientation uniquement via SceneNode), pour avoir un rendu correct sans hacks.
  • Intégration des Compute shaders à Castor3D, avec ses compagnons les Shader Storage Buffers et Atomic Counter Buffers.
  • L'implémentation des Textures a été complètement revue, nous avons maintenant la classe TextureLayout, qui contient les TextureImages et le TextureStorage par image. Cela a permis la création des textures cube.
  • Le rendu des Billboards n'utilise plus les geometry shaders, mais repose maintenant sur l'instantiation hardware.
  • FrameVariableBuffer a été remplacée par UniformBuffer, qui ne dépend plus du programme, et par UniformBufferBinding, qui elle dépend du programme utilisé. Les instances de UniformBufferBinding sont stockées par RenderPipeline.
  • FrameVariable a été remplacée par 2 classes : Uniform (pour les variables uniformes d'un UniformBuffer), et PushUniform (pour les variables uniformes hors d'un UniformBuffer).

Corrections de bugs

  • Le transfert des textures en RAM a été corrigé.

Téléchargements



Version 0.8.0

Date : 07/04/2016

Fonctionnalités

  • Les incrustations texte peuvent maintenant avoir un alignement vertical et/ou horizontal.
  • Les framebuffers de la fenêtre sont maintenant récupérés et liables, on ne peut cependant pas y ajouter d'attaches.
  • SceneFileParser a été étendue, pour pouvoir utiliser des directives d'analyse depuis des plug-ins externes.
  • Le système d'animations par squelette est maintenant finalisé et fonctionnel.
  • Castor3D peut maintenant lire les scènes depuis des archives ZIP.
  • Castor3D utilise le High Dynamic Range pour dessiner les scènes.
  • Implémentation d'un subdiviseur tessellation de Phong.
  • Implémentation d'un plug-in d'importation de fichiers FBX.
  • Le premier plug-in d'effet post rendu a été implémenté: HDR Bloom.
  • Nouveau plug-in, permettant la création d'IHM au sein des scènes Castor3D : CastorGUI.

Corrections de bugs

  • Correction de l'instanciation GPU.
  • Correction d'un bug dans la gestion des matériaux des incrustations panneaux bordurés.
  • Correction d'un bug pour les incrustations, révélé sur les GPU Intel
  • Correction des billboards.
  • Correction du sudiviseur PN Triangles, en utilisant des patches Bézier.

Téléchargements



Version 0.7.0

Date : 03/12/2014

Fonctionnalités

  • Multi Sampling Anti Aliasing
    Utilisation de l'alpha to coverage
  • Deferred Rendering
  • Rendu en texture
    Rendu en texture
  • Incrustations 2D
    Incrustations avec texte
  • Ajout de canaux pour les textures (couleur, ambiante, diffuse, spéculaire, normale, hauteur ...).
  • Implémentation des Frame Buffer.
  • Réduction de l'occupation mémoire des tampons de sommets.
  • Les lumières sont maintenant implémentées dans une texture, passant la limite de 8 à 100 sources.

Téléchargements



Version 0.6.5.0

Date : 30/08/2011

Fonctionnalités

  • Calcul de l'espace tangent lors de la création des primitives. Accessible dans les shaders avec 'attribute/in vec3 tangent'.
    Normal mapping sur un modèle OBJ Relief Mapping
  • Ajout de la récupération des UV dans la description en mode texte des meshes au format cscn
  • Fonctionne maintenant sous Linux (Gtk), testé sous Debian (Squeeze et Wheezy), Fedora 13 et Mandriva 10

Corrections de bugs

  • Plantage lors de la fermeture de l'application - Corrigé, dû au ShaderManager

Téléchargements



Version 0.6.1.2

Date : 17/03/2011

Fonctionnalités

  • Création d'une boîte de dialogue de sélection de renderer au lancement de CastorViewer et CastorShape, ajout d'un splash screen pour ces applications.
    Sélection du renderer Splash screen
  • Ajout d'une petite appli qui transforme n'importe quel type d'image en XPM, plus facile pour le développement multiplateforme avec wxWidgets.
  • Ajout de nouvelles fonctionnalités aux fichiers de scène (alpha_rejection, rgb_blend, alpha_blend, hl_shader_program, ...).
  • Optimisation du fichier CMakeLists et des fichiers du dossier 'cmake_modules' de façon à mieux prendre en charge les différentes plateformes, ainsi que les différentes configurations des PC clients.
  • Revue du système de VertexBuffers et IndexBuffers, introduction de la notion de VertexDeclaration et BufferElement, ainsi on peut créer des VertexBuffers en mettant à peu près ce que l'on veut comme données dedans (parmi positions, normals, tangents, diffuse, texcoords0,1,2,3) et ordonnées comme on veut.
  • La classe Vertex dérive donc maintenant de BufferElement.
  • Les TextureEnvironment vont disparaitre à la prochaine version, la gestion du multitexturing se faisant maintenant directement au niveau des passes et des texture units.

Téléchargements



Version 0.6.1.1

Date : 21/01/2011

Fonctionnalités

  • Création d'un fichier CMakeLists pour générer la solution à partir de CMake.
  • Réorganisation des fichiers du dossier afin de mieux se prêter au passage à CMake
  • Séparation de la classe Plugin en 3 types différents : Renderer, Divider et Importer. Ainsi on pourra ajouter de nouveaux types de plugin aisément et l'ajout d'importers et de subdiviseurs se fera sans devoir recompiler tous les projets.
  • Ca entraîne la création d'un projet par importeur existant (OBJ, PLY, MD2, MD3, 3DS, ...)
    Modèle PLY Modèle MD3 Modèle MD2 Modèle 3DS
  • PNTrianglesDivider reste dans le Castor car utilisé par la primitive Icosaedron, LoopDivider est quand à lui placé dans un plugin.
    Torre subdivisé selon l'algorithme de Loop
  • J'ai commencé à implémenter les shaders Cg. Ca implique une modification des fichiers de scène, car dans Cg les variables uniform sont liées à un programme (vertex, pixel, geometry) plutôt qu'au shader complet comme c'est le cas en GLSL. Il reste quelques trucs à revoir (je ne sais pas encore quoi) pour que ça fonctionne.
  • La création des Buffers utilisés pour le rendu (Vertex, Attribute, Texture, Normals, ...) se fait maintenant par le RenderSystem => on peut donc les créer dans Castor3D et pas seulement dans les renderer (GL2, GL3 et dans le futur D3D).
  • Suppression des Singletons pour les différents Managers (Image, Font, Scene, Material, Animation et Mesh).
  • J'ai retouché les SceneNodes, j'ai refusionné les 3 classes différentes en une seule pour des commodités d'utilisation.
  • Les subdiviseurs peuvent subdiviser dans un thread à part, permettant de ne pas figer une application pendant la subdivision (cf. CastorShape). Il est possible d'assigner une fonction qui sera lancée à la fin de la subdivision (cf. CastorShape).
  • La fonction AddPoint de Submesh crée maintenant des IdPoint et la fonction AddFace se sert d'eux pour générer les Vertex.

Corrections de bugs

  • Correction du LoopDivider qui ne repositionnait plus les Vertex (les nouveaux étaient créés mais plus replacés, dû à la nouvelle architecture des Vertex)

Téléchargements



Version 0.6.1.0

Date : 10/12/2010

Fonctionnalités

  • La classe TransformationMatrix n'existe plus, il ne s'agit plus que d'une collection de fonctions sur matrices carrées 4x4.
  • Modification de la gestion des SceneNode : Une classe de base NodeBase qui contient les informations qui se trouvaient dans SceneNode, 3 classes dérivées (GeometryNode, CameraNode et LightNode) qui s'occupent des fonctionnalités spécifiques au rendu de chacun des types liés (respectivement Geometry, Camera et Light).
  • La classe MovableObject a maintenant moins de fonctionnalités (en fait elle n'a plus qu'un nom et un NodeBase) et les classes Light et Camera dérivent maintenant de cette classe (pour plus d'uniformité dans les déplacements de ces objets par rapport aux géométries)
  • Renommage des classes UniformVariable en FrameVariable, pour refléter plus ce que c'est et moins lier ce genre de choses à OpenGL.

Corrections de bugs

  • Correction du plantage à la fermeture du soft en release uniquement.

Téléchargements



Version 0.6.0.0

Date : 05/11/2010

Fonctionnalités

  • Ajout d'une classe de gestion des matrices de projection, normale et visualisation, en vue de la suppression du pipeline fixe dans les renderers OpenGL.
  • Modification du render system, ajout d'une classe renderable qui se charge de créer le renderer associé, afin de simplifier la création des dérivés de cette classe (submesh, scene node, light, camera...)
  • Changement des noms des fichiers de scène/materiaux/meshes du moteur (respectivement cscn/cmtl/cmsh)

Corrections de bugs

  • Protection par recursive mutex des données partagées (par les managers, essentiellement) permettant d'éviter des plantages aléatoires.

Téléchargements



Version 0.5.0.2

Date : 14/09/2010

Fonctionnalités

  • Nouvelle primitive : la projection, qui effectue donc une projection d'un arc sur une profondeur et qui lie l'origine et la projection par des faces.
  • Meilleure prise en charge des materiaux du format MD3 (contenus dans les fichiers .skin et .shader). Encore du taf là dessus, mais il faut que je récupère une meilleure documentation du format.
  • Meilleure prise en charge des materiaux du format 3DS, notamment au niveau des couleurs Ambient, Diffuse, Specular et Shininess

Corrections de bugs

  • Correction des normales (elles étaient générées à l'envers).

Téléchargements




Image Large