Крошечный программный рендеризер C ++, который реализует основные этапы конвейера рендеринга GPU, включая ратеризацию точек, линии и полигона, отображение текстуры, тестирование глубины, цветовое смешивание и т. Д., И имилирует вертексные шейдеры и фрагментные шейдеры с использованием C ++, 3D -модели (GLTF), загружаются Assimp и использующими GLM в качестве математической библиотеки. Проект также добавляет реализацию OpenGL и Vulkan Renderers, вы можете переключаться между ними (Software/OpenGL/Vulkan) в режиме реального времени во время работы.
Цель этого проекта - предоставить отправную точку для разработчиков, которые хотят узнать о современном графическом программировании.
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
dFdx dFdyLod , Bias , OffsetLinearimguiВсе рендереры (программное обеспечение/opengl/vulkan) реализованы на основе этого класса абстрактного рендеринга:
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 ();
};Чтобы создать проект, вы должны сначала установить следующие инструменты:
Если вы хотите запустить рендеринг Vulkan, вам необходимо установить библиотеку Вулкана следующим образом:
Чтобы получить код для этой библиотеки, вы можете клонировать репозиторий GitHub, используя следующую команду:
git clone https://github.com/keith2018/SoftGLRender.gitВ качестве альтернативы, вы можете загрузить исходный код в качестве zip -файла из репозитория GitHub.
Чтобы создать проект, перейдите к корневому каталогу репозитория и запустите следующие команды:
mkdir build
cmake -B ./build -DCMAKE_BUILD_TYPE=Release
cmake --build ./build --config Release Это сгенерирует исполняемый файл и копирует активы в bin каталогов, который вы можете запустить, выполнив следующую команду:
cd bin/Release
./SoftGLRenderassets : модели GLTF и текстуры Skybox, assets.json - это индекс всех материалов модели и Skyboxsrc : Основной каталог исходного кодаBase : основные уроки утилиты, такие как файл, хэш, таймер и т. Д.Render : абстракция рендеринга, включает вершину, текстуру, униформу, кадрбуффер и т. Д.Software : реализация программного оборудованияOpenGL : реализация рендеринга OpenGLVulkan : вульковский реализация рендерингаViewer : GLTF Загрузка (на основе Assimp), камера и контроллер, конфигурационная панель и управление рендерингомShader/GLSL : GLSL Shader CodShader/Software : C ++ Моделирование вершин -шейдеров и фрагментных шейдеровthird_party : внешние библиотеки и активы 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 Если вы хотите внести свой вклад в проект, вы можете отправить запросы на привлечение с помощью исправлений ошибок, новых функций или других улучшений. Пожалуйста, убедитесь, что ваш код хорошо документирован и придерживается стандартов кодирования проекта.
Этот код лицензирован по лицензии MIT (см. Лицензию).