Tiny C ++ Software Renderer/Rasterizer que implementa los pasos principales de la tubería de representación de GPU, incluidos el rasterización de puntos, línea y polígono, mapeo de texturas, pruebas de profundidad, combinación de colores, etc., y emula sombreadores de vértices y sombreadores de fragmentos utilizando modelos C ++, 3D (GLTF) están cargados por Assimp y utilizando GLM como biblioteca matemática. El proyecto también agrega la implementación de renderistas de OpenGL y Vulkan, puede cambiar entre ellos (Software/OpenGL/Vulkan) en tiempo real mientras se ejecuta.
El propósito de este proyecto es proporcionar un punto de partida para los desarrolladores que desean aprender sobre la programación de gráficos modernos.
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
dFdx dFdyLod , Bias , OffsetLinearimguiTodos los renderistas (Software/OpenGL/Vulkan) se implementan en función de esta clase de renderizador abstracto:
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 el proyecto, primero debe instalar las siguientes herramientas:
Si desea ejecutar el renderizador de Vulkan, debe instalar la biblioteca Vulkan de la siguiente manera:
Para obtener el código para esta biblioteca, puede clonar el repositorio de GitHub usando el siguiente comando:
git clone https://github.com/keith2018/SoftGLRender.gitAlternativamente, puede descargar el código fuente como un archivo zip desde el repositorio de GitHub.
Para construir el proyecto, navegue al directorio raíz del repositorio y ejecute los siguientes comandos:
mkdir build
cmake -B ./build -DCMAKE_BUILD_TYPE=Release
cmake --build ./build --config Release Esto generará el archivo ejecutable y la copia de los activos en bin de directorio, que puede ejecutar ejecutando el siguiente comando:
cd bin/Release
./SoftGLRenderassets : los modelos GLTF y las texturas de Skybox, assets.json es el índice de todos los materiales de modelos y skyboxsrc : directorio de código fuente principalBase : clases básicas de utilidad como archivo, hash, temporizador, etc.Render : Abstracción del renderizador, incluya Vértice, Textura, Uniforme, FrameBuffer, etc.Software : implementación del renderizador de softwareOpenGL : Implementación de renderizador de OpenGLVulkan : Implementación del renderizador de VulkanViewer : carga GLTF (basada en Assimp), cámara y controlador, panel de configuración y administración de pases de renderizadoShader/GLSL : Código de sombreador GLSL, para OpenGL y Vulkan RendererShader/Software : simulación C ++ de sombreadores de vértices y sombreadores de fragmentosthird_party : bibliotecas y activos externas assimp https://github.com/assimp/assimpglfw https://github.com/glfw/glfwglm https://github.com/gtruc/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 Si desea contribuir al proyecto, puede enviar solicitudes de extracción con correcciones de errores, nuevas funciones u otras mejoras. Asegúrese de que su código esté bien documentado y se adhiera a los estándares de codificación del proyecto.
Este código tiene licencia bajo la licencia MIT (ver licencia).