O minúsculo renderizador/rasterizador de software C ++ que implementa as principais etapas do pipeline de renderização da GPU, incluindo rasterização de pontos, linhas e polígonos, mapeamento de textura, teste de profundidade, mistura de cores, etc. e emula os shaders de vértices e os shaders de GlM e os modelos de CS+Math) (GLTF). O projeto também adiciona implementação de renderizadores OpenGL e Vulkan, você pode alternar entre eles (Software/OpenGL/Vulkan) em tempo real durante a execução.
O objetivo deste projeto é fornecer um ponto de partida para os desenvolvedores que desejam aprender sobre a programação gráfica moderna.
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
dFdx dFdyLod , Bias , OffsetLinearimguiTodos os renderizadores (Software/OpenGL/Vulkan) são implementados com base nesta classe de renderizador abstrato:
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 ();
};Para construir o projeto, você deve primeiro instalar as seguintes ferramentas:
Se você deseja executar o renderizador Vulkan, precisa instalar a Biblioteca Vulkan da seguinte maneira:
Para obter o código para esta biblioteca, você pode clonar o repositório do GitHub usando o seguinte comando:
git clone https://github.com/keith2018/SoftGLRender.gitComo alternativa, você pode baixar o código -fonte como um arquivo zip do repositório do GitHub.
Para construir o projeto, navegue até o diretório raiz do repositório e execute os seguintes comandos:
mkdir build
cmake -B ./build -DCMAKE_BUILD_TYPE=Release
cmake --build ./build --config Release Isso gerará o arquivo executável e copiará ativos para a bin do diretório, que você pode executar executando o seguinte comando:
cd bin/Release
./SoftGLRenderassets : Modelos GLTF e texturas de Skybox, assets.json é o índice de todos os materiais modelo e Skyboxsrc : diretório de código -fonte principalBase : classes básicas de utilitário como arquivo, hash, timer, etc.Render : abstração do renderizador, incluir vértice, textura, uniforme, buffer de estrutura, etc.Software : implementação do renderizador de softwareOpenGL : implementação do renderizador OpenGLVulkan : implementação do renderizador VulkanViewer : Carregamento GLTF (baseado em Assim), Câmera e Controlador, Painel de Config e Gerenciamento de Passos RenderizadosShader/GLSL : Código de shader GLSL, para renderizador OpenGL e VulkanShader/Software : Simulação C ++ de Shaders de Vértice e Shaders de Fragmentothird_party : bibliotecas e ativos externos 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-librarias esdks/vulkanmemoryAllocator Se você deseja contribuir para o projeto, poderá enviar solicitações de puxar com correções de bugs, novos recursos ou outras melhorias. Verifique se o seu código está bem documentado e adere aos padrões de codificação do projeto.
Este código está licenciado sob a licença do MIT (consulte a licença).