bitbeet.dev
← volver a proyectos
// 01 · gráficos

Prisvector Engine

Motor de juego C++20 con ECS, deferred rendering y editor.


STACK
C++20 · OpenGL 4.5 · GLSL · EnTT · GLFW · GLM · ImGui · ImGuizmo · spdlog · CMake
STATUS
live
LINK
github.com/Perkybeet/prisvector-engine ↗

Prisvector es un motor de juego completo en C++20, no una demo de render. Tiene ventana, ECS, renderer, pipeline de assets y un editor con paneles acoplables todo escrito desde cero sobre OpenGL 4.5 moderno, EnTT para el sistema de entidades y un envoltorio fino alrededor de GLFW y GLAD.

Pipeline de render

Prisvector deferred render pipeline: scene entities through G-Buffer, shadow pass, lighting pass, particles and post-processing into the final framebuffer ECS · RENDER PHASE Scene Entities meshes · materials · lights GEOMETRY PASS · MRT Normal Albedo Metal · Rough Depth SHADOW PASS Cascaded Shadow Maps C0 C1 C2 C3 LIGHTING PASS PBR · Cook-Torrance directional · point · spot PARTICLE PASS GPU Compute Dispatch instanced · sorted · alpha post · HDR tonemap · gamma SWAP CHAIN Framebuffer
deferred pipeline — G-Buffer feeds three parallel passes, then post-processing

El renderer es diferido, no directo: la geometría escribe en un G-Buffer (albedo, normales, material) y un segundo pase resuelve las luces. Así el coste de iluminación es proporcional a los píxeles en pantalla, no a la complejidad de la escena.

  • G-Buffer pass — framebuffer MRT con normal, albedo, metallic-roughness y profundidad.
  • Lighting pass — PBR (Cook-Torrance) con luces direccionales, puntuales y focales.
  • Shadow pass — Cascaded Shadow Maps para direccionales; atlas para focales.
  • Particle pass — dispatch de compute shader para millones de partículas; draw instanciado de vuelta a la escena.
  • Post-processing — HDR tonemapping (tipo ACES), gamma, hueco para bloom futuro.

ECS con scheduling por fases

Los sistemas no corren en un bucle plano. El scheduler los ejecuta en 9 fases nombradas (PreUpdate, Input, Physics, Update, LateUpdate, PreRender, Render, PostRender, Cleanup) para que las dependencias sean explícitas y el orden determinista. EnTT aporta almacenamiento denso e iteración rápida.

// Registro típico de sistemas
scheduler.register_system<MovementSystem>(SystemPhase::Update);
scheduler.register_system<CameraSystem>(SystemPhase::LateUpdate);
scheduler.register_system<ShadowSystem>(SystemPhase::PreRender);
scheduler.register_system<DeferredRenderSystem>(SystemPhase::Render);

Editor

La sandbox incluye un editor estilo Unity:

  • Layout dockable vía la rama docking de Dear ImGui.
  • Paneles independientes: jerarquía, inspector, viewport, consola, asset browser.
  • Gizmos de transformación (ImGuizmo) con snapping en grid y por pasos.
  • Play mode que serializa la escena al arrancar y restaura al parar.
  • Cámara de editor con orbit/pan/zoom tipo Maya/Blender (Alt + arrastre).

Qué tiene de interesante

  • No hay framework de render debajo — cada bind de VAO, cada update de uniform es código mío.
  • Hot-reload de shaders: edita un GLSL y el motor recompila sin perder el estado de la escena.
  • Dependencias externas vía CMake FetchContent, así que un clon limpio + cmake --build produce el editor funcionando.

115+
Archivos C++
9
Fases del ECS
4.5
OpenGL core