{"id":16114751,"url":"https://github.com/solarliner/m2-opengl","last_synced_at":"2025-06-10T22:36:12.291Z","repository":{"id":210360767,"uuid":"599839632","full_name":"SolarLiner/m2-opengl","owner":"SolarLiner","description":null,"archived":false,"fork":false,"pushed_at":"2023-03-15T20:56:29.000Z","size":32085,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-12T13:54:15.601Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SolarLiner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-10T01:39:07.000Z","updated_at":"2023-03-15T20:59:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"cc7222c9-574a-4bd9-ab6e-9e4f3151c36d","html_url":"https://github.com/SolarLiner/m2-opengl","commit_stats":null,"previous_names":["solarliner/m2-opengl"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolarLiner%2Fm2-opengl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolarLiner%2Fm2-opengl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolarLiner%2Fm2-opengl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SolarLiner%2Fm2-opengl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SolarLiner","download_url":"https://codeload.github.com/SolarLiner/m2-opengl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247451658,"owners_count":20940944,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-09T20:15:40.313Z","updated_at":"2025-04-06T08:17:34.616Z","avatar_url":"https://github.com/SolarLiner.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Projet Informatique Graphique 3\n\nCe projet est une implémentation d'un moteur graphique avec rendu de type deffered,\ndans une pipeline HDR avec un modèle d'irradiance à microfacettes.\n\nCodé en Rust, il utilise OpenGL 3.3 core et devrait normalement pouvoir compiler sans dépendance\nsupplémentaire (OpenGL est évidemment requis, ainsi qu'une toolchain Rust).\nIl a été testé sous Windows (toolchain GNU) et Linux. Rien n'est spécifique à la toolchain GNU Windows\nde Rust, la toolchain MSVC doit marcher aussi.\n\n![sponza.png](doc/sponza.png)\n![marble bust.png](doc/marble%20bust.png)\n\n## Structure\n\nLe projet est structuré selon plusieurs dossiers à la racine :\n\n- `assets` sont les données externes et ne contiennent pas de contenu original - ils sont là pour pouvoir être\n  chargés par les binaries.\n- `bin` contient les projets (`crates` en jargon Rust) qui produisent des exécutables, qui servent à\n  montrer plusieurs aspects du projet. En particulier, les binaires `sandbox` et `load_gltf` sont notables, car\n  permettent de montrer le pipeline de rendu en son complet. Ils sont resp. un pseudo-éditeur de scène et un\n  visualiseur de fichiers GLTF\n- `lib` sont les différentes bibliothèques qui amènent différents niveaux d'abstractions, ainsi que les\n  fonctionnalités principales du projet. En particulier, `violette` est la bibliothèque d'abstraction OpenGL,\n  fournissant des objets RAII et une API *safe* et \"bindless\" autour d'OpenGL.\n- `res` est le répertoire des ressources internes du projet, notamment les sources des shaders en GLSL. Une\n  couche de modularité a été ajoutée par le biais d'un pré-processeur personnalisé (situé dans `lib/glsl-preprocessor`)\n  pour permettre les `#include`. Ceci a été fait surtout pour réutiliser des définitions d'uniform blocks à\n  travers plusieurs shaders.\n\n## Pipeline de rendu\n\nLe rendu d'objets se fait via une architecture `deffered` qui sous-traite l'éclairage en se servant des données\nsuivantes :\n\n- Position\n- Albedo\n- Normales + \"Coverage\" (texture `GL_RGBA32F` avec l'alpha mis à 1 lors de l'écriture, pour servir de masque\n  lors de la passe defferée)\n- Roughness/Metal (packée dans une texture `GL_RG32F`)\n- Emission\n\nChaque mesh possède une information de position, normale et UV. Chaque matériau possède à la fois une texture\net un facteur indépendant qui écrit dans ces textures. Ceci est fait par les\nshaders [mesh.vert.glsl](res/shaders/mesh/mesh.vert.glsl)\net [mesh.frag.glsl](res/shaders/mesh/mesh.frag.glsl), la définition d'un Vertex est faite dans\n[material.rs](lib/rose-renderer/src/material.rs) et celle de l'uniform `View` dans\n[camera.rs](lib/rose-core/src/camera.rs). À noter que le `derive(VertexAttributes)` est une macro personnalisée définie\ndans [violette-derive](lib/violette-derive/src/lib.rs).\n\nLe calcul de l'éclairage se fait en itérant côté CPU sur les lumières, en avançant un curseur sur l'UBO des\nlumières qui ont été auparavant envoyées au GPU (dans `sandbox`, une détection des changements permet de mettre\nà jour ce buffer automatiquement lors d'un changement d'un composant touchant à une lumière). L'éclairage par\nl'environnement est une étape à part qui utilise des textures d'irradiance diffuse et spéculaire qui sont calculées\nau chargement de la carte d'environnement (dans `sandbox` et `load_gltf`, il suffit de glisser une texture sur la\nfenêtre pour la changer et refaire ces calculs).  \nL'éclairage par environnement se fait dans [equirectangular.glsl](res/shaders/screen/env/equirectangular.glsl), avec la\ngénération des cartes d'irradiance [diffuse](res/shaders/screen/env/irradiance.glsl) et\n[spéculaires](res/shaders/screen/env/specular_ibl.glsl).\n\nUne étape de post-processing est enfin appliquée afin de combiner le bloom, de lens flares et de dessiner la scène à\nl'écran, appliquer un opérateur de\ntonemapping (ACES Fitted), dont le shader est défini dans [postprocess.glsl](res/shaders/screen/postprocess.glsl).\n\nUne étape de génération de bloom est ajoutée pour donner une impression d'éblouissement, et parce que c'est la seule\n*vraie* raison de faire un pipeline HDR. Elle se base sur un pull push décrite\n[dans cet article](https://learnopengl.com/Guest-Articles/2022/Phys.-Based-Bloom), et est implémentée côté CPU dans\n[blur.rs](lib/rose-renderer/src/postprocess/blur.rs), et côté GPU\navec [downsample.glsl](res/shaders/screen/blur/downsample.glsl)\net [upsample.glsl](res/shaders/screen/blur/upsample.glsl).\n\n![lensflares.png](doc/lensflares.png)\n\n```mermaid\nflowchart LR\n    subgraph uniforms [Uniforms]\n        lights[(Lights UBO)];\n        view[(View uniforms)];\n    end\n    subgraph geom [Geometry]\n        gPosition[Position];\n        gNormal[Normal];\n        gUV[UV];\n        gBoneIndex[Bone index];\n        gBoneWeights[Bone weight];\n        \n        gBoneIndex --\u003e gBoneWeights --\u003e gPosition \u0026 gNormal;\n    end\n    subgraph material [Material]\n        mColor[[Color]];\n        mColorFac[Color multiplier];\n        mNormal[[Normal]];\n        mNormalFac[Normal multiplier];\n        mRoughMetal[[Roughness/Metal]];\n        mRoughMetalFac[Roughness/Metal multiplier];\n        mEmit[[Emission]];\n        mEmitFac[Emission factor];\n\n        mColorFac --\u003e mColor;\n        mNormalFac --\u003e mNormal;\n        mRoughMetalFac --\u003e mRoughMetal;\n        mEmitFac --\u003e mEmit;\n    end\n    subgraph gb [Geometry Pass]\n        Position[[Position]];\n        Albedo[[Albedo]];\n        Normal[[Normal]];\n        RG[[Roughness/Metal]];\n        Emission[[Emission]];\n    end\n    subgraph env [Environment Pass]\n        lEnvMap[[Environment map]];\n        lIrradiance[[Pre-computed diffuse irradiance]];\n        lSpecIBL[[Pre-computed specular irradiance]];\n        lEnvMap --\u003e lIrradiance \u0026 lSpecIBL;\n    end\n    subgraph light [Light pass]\n        lOutput[[Shading output]];\n    end\n    subgraph bloom [Bloom pass]\n        bMip[[Mipchain 1..N]];\n        bMip --\u003e bMip;\n    end\n    subgraph pp [Post-process]\n        backbuffer[[Backbuffer]];\n    end\n    \n    view \u0026 gPosition \u0026 gNormal --\u003e Position \u0026 Normal;\n    gUV --\u003e mColor \u0026 mNormal \u0026 mRoughMetal \u0026 mEmit --\u003e Albedo \u0026 Normal \u0026 RG \u0026 Emission;\n    lights \u0026 Albedo \u0026 Normal \u0026 RG \u0026 Emission --\u003e lOutput;\n    lIrradiance \u0026 lSpecIBL\n    --\u003e lOutput\n    --\u003e bMip\n    --\u003e backbuffer;\n```\n\n## Ce qui n'a pas marché\n\n### SSAO\n\nIl y a une branche dans le dépot Git concernant une implémentation d'un SSAO. Le principal problème non-résolu à temps\nconcerne le fait que l'occlusion semble se \"renverser\" selon la position de la caméra.\n\n### Mesh skinning\n\nUne erreur *quelque part* fait que les index vers les matrices de transformation ne sont pas bien passées\n(le format reçu par OpenGL est incorrect pour l'index alors que l'attribut est bien mis en `GL_UNSIGNED_INT`). Le\nrésultat est que les indices doivent être codés dans le shader pour avoir une déformation.\n\n### Transparence\n\nPar manque de temps, la transparence n'a pas été considérée.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolarliner%2Fm2-opengl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsolarliner%2Fm2-opengl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolarliner%2Fm2-opengl/lists"}