Tiny C ++ Software -Renderer/Rasterizer, die die Hauptschritte der GPU -Rendering -Pipeline implementiert, einschließlich Punkt-, Linien- und Polygon -Rasterisierung, Texturzuordnung, Tiefentests, Farbmischung usw. und emuliert die Scheitelpunkt -Shader und Fragment -Shader mit C ++, 3D -Models (Gltf) werden von Assimp und mit GLM als Mathe -Bibliothek geladen. Das Projekt fügt außerdem die Implementierung von OpenGL und Vulkan Renderers hinzu. Sie können während der Ausführung in Echtzeit zwischen ihnen (Software/OpenGL/Vulkan) wechseln.
Der Zweck dieses Projekts ist es, Entwicklern einen Ausgangspunkt zu bieten, der sich über moderne Grafikprogramme kennenlernen möchte.
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
dFdx dFdyLod , Bias , OffsetLinear gespeichertimguiAlle Renderer (Software/OpenGL/Vulkan) werden basierend auf dieser abstrakten Renderer -Klasse implementiert:
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 ();
};Um das Projekt zu erstellen, müssen Sie zunächst die folgenden Tools installieren:
Wenn Sie den Vulkan -Renderer ausführen möchten, müssen Sie die Vulkan -Bibliothek wie folgt installieren:
Um den Code für diese Bibliothek zu erhalten, können Sie das GitHub -Repository mit dem folgenden Befehl klonen:
git clone https://github.com/keith2018/SoftGLRender.gitAlternativ können Sie den Quellcode als ZIP -Datei aus dem GitHub -Repository herunterladen.
Um das Projekt zu erstellen, navigieren Sie zum Stammverzeichnis des Repositorys und führen Sie die folgenden Befehle aus:
mkdir build
cmake -B ./build -DCMAKE_BUILD_TYPE=Release
cmake --build ./build --config Release Dadurch wird die ausführbare Datei generiert und Vermögenswerte in das bin kopiert, die Sie durch Ausführen des folgenden Befehls ausführen können:
cd bin/Release
./SoftGLRenderassets : GLTF -Modelle und Skybox -Texturen, assets.json ist der Index aller Modell- und Skybox -Materialiensrc : Hauptquellcode -VerzeichnisBase : Grundlegende Versorgungsklassen wie Datei, Hash, Timer usw.Render : Renderer -Abstraktion, Scheitelpunkt, Textur, Uniform, FrameBuffer usw. enthalten.Software : Software -Renderer -ImplementierungOpenGL : OpenGL Renderer -ImplementierungVulkan : Umsetzung von Vulkan RenderererViewer : GLTF -Laden (basierend auf Annehme), Kamera & Controller, Konfigurationsfeld und Render -Pass -ManagementShader/GLSL : GLSL Shader Code für OpenGL & Vulkan RenderererShader/Software : C ++ Simulation von Scheitelpunkt -Shadern und Fragment -Shadernthird_party : externe Bibliotheken und Vermögenswerte 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-librariesandsdks/vulkanmemoryallocator Wenn Sie zum Projekt beitragen möchten, können Sie gerne Pull -Anfragen mit Fehlerbehebungen, neuen Funktionen oder anderen Verbesserungen einreichen. Bitte stellen Sie sicher, dass Ihr Code gut dokumentiert ist und sich an den Codierungsstandards des Projekts hält.
Dieser Code ist unter der MIT -Lizenz lizenziert (siehe Lizenz).