Tiny C ++ Renderer / Rasterizer qui implémente les étapes principales du pipeline de rendu GPU, y compris la rasterisation point, la ligne et les polygones, la cartographie de la texture, les tests de profondeur, le mélange de couleurs, etc., et émule les shaders vertex et les shaders de fragments en utilisant C ++, les modèles 3D (GLTF) sont chargés par Animp, et l'utilisation de GLM comme bibliothèque mathématique. Le projet ajoute également une implémentation OpenGL et Vulkan Renderers, vous pouvez basculer entre eux (logiciel / opengl / vulkan) en temps réel pendant l'exécution.
Le but de ce projet est de fournir un point de départ aux développeurs qui souhaitent en savoir plus sur la programmation graphique moderne.
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
dFdx dFdyLod , Bias , OffsetLinearimguiTous les rendus (logiciel / OpenGL / Vulkan) sont mis en œuvre en fonction de cette classe de rendu abstraite:
class Renderer {
public:
// framebuffer
std::shared_ptr<FrameBuffer> createFrameBuffer ( bool offscreen);
// texture
std::shared_ptr<Texture> createTexture ( const TextureDesc &desc);
// vertex
std::shared_ptr<VertexArrayObject> createVertexArrayObject ( const VertexArray &vertexArray);
// shader program
std::shared_ptr<ShaderProgram> createShaderProgram ();
// pipeline states
std::shared_ptr<PipelineStates> createPipelineStates ( const RenderStates &renderStates);
// uniform
std::shared_ptr<UniformBlock> createUniformBlock ( const std::string &name, int size);
std::shared_ptr<UniformSampler> createUniformSampler ( const std::string &name, const TextureDesc &desc);
// pipeline
void beginRenderPass (std::shared_ptr<FrameBuffer> &frameBuffer, const ClearStates &states);
void setViewPort ( int x, int y, int width, int height);
void setVertexArrayObject (std::shared_ptr<VertexArrayObject> &vao);
void setShaderProgram (std::shared_ptr<ShaderProgram> &program);
void setShaderResources (std::shared_ptr<ShaderResources> &uniforms);
void setPipelineStates (std::shared_ptr<PipelineStates> &states);
void draw ();
void endRenderPass ();
};Pour construire le projet, vous devez d'abord installer les outils suivants:
Si vous souhaitez exécuter le Vulkan Renderer, vous devez installer la bibliothèque Vulkan comme suit:
Pour obtenir le code de cette bibliothèque, vous pouvez cloner le référentiel GitHub en utilisant la commande suivante:
git clone https://github.com/keith2018/SoftGLRender.gitAlternativement, vous pouvez télécharger le code source en tant que fichier zip à partir du référentiel GitHub.
Pour construire le projet, accédez au répertoire racine du référentiel et exécutez les commandes suivantes:
mkdir build
cmake -B ./build -DCMAKE_BUILD_TYPE=Release
cmake --build ./build --config Release Cela générera le fichier exécutable et la copie des actifs vers Directory bin , que vous pouvez exécuter en exécutant la commande suivante:
cd bin/Release
./SoftGLRenderassets : Modèles GLTF et Textures Skybox, assets.json est l'index de tous les matériaux du modèle et Skyboxsrc : répertoire de code source principalBase : classes utilitaires de base comme le fichier, le hachage, la minuterie, etc.Render : abstraction de rendu, inclure le sommet, la texture, l'uniforme, le framebuffer, etc.Software : implémentation de rendu logicielOpenGL : mise en œuvre d'OpenGl RendererVulkan : Mise en œuvre de Vulkan RendererViewer : Chargement GLTF (basé sur Asimp), appareil photo et contrôleur, panneau de configuration et gestion des passesShader/GLSL : Code de shader GLSL, pour OpenGl & Vulkan RendererShader/Software : simulation C ++ des shaders vertex et des shaders de fragmentsthird_party : bibliothèques et actifs externes assimp https://github.com/assimp/assimpglfw https://github.com/glfw/glfwglm https://github.com/g-truc/glmglslang https://github.com/khronosgroup/glslangimgui https://github.com/ocornut/imguijson11 https://github.com/dropbox/json11stb_image https://github.com/nothings/stbvma https://github.com/gpuopen-braresandsdks/vulkanmemoryallocator Si vous souhaitez contribuer au projet, vous êtes invités à soumettre des demandes de traction avec des corrections de bogues, de nouvelles fonctionnalités ou d'autres améliorations. Veuillez vous assurer que votre code est bien documenté et adhère aux normes de codage du projet.
Ce code est concédé sous licence MIT (voir licence).