Renderer/rasterizer perangkat lunak C ++ kecil yang mengimplementasikan langkah -langkah utama dari pipa rendering GPU, termasuk rasterisasi titik, garis dan poligon, pemetaan tekstur, pengujian kedalaman, pencampuran warna, dll., Dan meniru vertex shader dan shader fragmen menggunakan C ++, model 3D (GLTF) dimuat oleh Assimp, dan menggunakan GLM. Proyek ini juga menambahkan implementasi OpenGL dan Vulkan Renderers, Anda dapat beralih di antara mereka (Software/OpenGL/Vulkan) secara real time saat berjalan.
Tujuan dari proyek ini adalah untuk memberikan titik awal bagi pengembang yang ingin belajar tentang pemrograman grafis modern.
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
dFdx dFdyLod , Bias , OffsetLinearimguiSemua renderers (Software/OpenGL/Vulkan) diimplementasikan berdasarkan kelas renderer abstrak ini:
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 ();
};Untuk membangun proyek, Anda harus terlebih dahulu menginstal alat berikut:
Jika Anda ingin menjalankan vulkan renderer, Anda perlu menginstal Perpustakaan Vulkan sebagai berikut:
Untuk mendapatkan kode untuk perpustakaan ini, Anda dapat mengkloning repositori GitHub menggunakan perintah berikut:
git clone https://github.com/keith2018/SoftGLRender.gitAtau, Anda dapat mengunduh kode sumber sebagai file zip dari repositori GitHub.
Untuk membangun proyek, arahkan ke direktori root dari repositori dan jalankan perintah berikut:
mkdir build
cmake -B ./build -DCMAKE_BUILD_TYPE=Release
cmake --build ./build --config Release Ini akan menghasilkan file yang dapat dieksekusi dan menyalin aset ke Directory bin , yang dapat Anda jalankan dengan mengeksekusi perintah berikut:
cd bin/Release
./SoftGLRenderassets : Model GLTF dan Tekstur Skybox, assets.json adalah indeks dari semua bahan model & skyboxsrc : Direktori Kode Sumber UtamaBase : Kelas utilitas dasar seperti file, hash, timer, dll.Render : Abstraksi Renderer, termasuk simpul, tekstur, seragam, framebuffer, dll.Software : Implementasi Renderer Perangkat LunakOpenGL : Implementasi Renderer OpenGLVulkan : Implementasi Renderer VulkanViewer : Pemuatan GLTF (Berdasarkan AssImp), Kamera & Pengontrol, Panel Konfigurasi, dan Manajemen Pass RenderShader/GLSL : Kode Shader GLSL, untuk Renderer OpenGL & VulkanShader/Software : C ++ Simulasi shader vertex dan shader fragmenthird_party : Perpustakaan dan Aset Eksternal 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-libraryandsdks/vulkanmemoryallocator Jika Anda ingin berkontribusi pada proyek, Anda dipersilakan untuk mengirimkan permintaan tarik dengan perbaikan bug, fitur baru, atau perbaikan lainnya. Harap pastikan bahwa kode Anda didokumentasikan dengan baik dan mematuhi standar pengkodean proyek.
Kode ini dilisensikan di bawah lisensi MIT (lihat lisensi).