Prowl’s rendering architecture is built around theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/ProwlEngine/Prowl/llms.txt
Use this file to discover all available pages before exploring further.
RenderPipeline abstract class. Every frame, the engine collects all renderable objects and lights into static lists, then delegates the actual GPU work to whichever RenderPipeline subclass is active. The pipeline decides how to sort, batch, cull, and shade those objects, making it straightforward to swap between forward rendering, deferred rendering, or a fully custom effect without touching game code. The built-in DefaultRenderPipeline provides PBR forward rendering, shadow maps, a procedural sky, an infinite editor grid, and post-processing effects out of the box.
Core Abstractions
RenderPipeline (abstract class)
RenderPipeline lives in Prowl.Runtime.Rendering.Pipelines and inherits from EngineObject. It owns two static collections shared across all pipeline instances: a flat list of IRenderable objects and a material-keyed dictionary of RenderBatch entries.
Abstract method
The camera whose view and projection matrices should be used for rendering.
Auxiliary per-frame data including editor grid settings, gizmo toggles, and scene-view flags (see below).
RenderingData
Render() carrying rendering-configuration flags for the current camera draw. IsSceneViewCamera distinguishes editor scene views from game cameras.
IRenderable
Objects that can be drawn by a pipeline must implementIRenderable:
Graphics.DrawMesh wraps a Mesh + Material pair in an internal MeshRenderable : IRenderable and registers it via RenderPipeline.AddRenderable.
IRenderableLight
Lights register themselves with:RenderBatch
WhenAddRenderable is called, the pipeline also inserts the renderable index into a Dictionary<Material, RenderBatch>:
RenderPipeline.EnumerateBatches(), draw all objects sharing the same material in one pass, then move to the next material. This avoids redundant pipeline state changes.
Static Pipeline API
All static members below are available from any code once at least oneRenderPipeline subclass is active.
The number of renderables registered for the current frame.
AddRenderable
Graphics.DrawMesh.
AddLight
Update / OnEnable lifecycle.
ClearRenderables
Graphics.EndFrame().
EnumerateBatches
GetRenderable / GetRenderables
GetLights
DefaultRenderPipeline
DefaultRenderPipeline is Prowl’s standard forward renderer. A singleton instance is available via DefaultRenderPipeline.Default.
What it does
Forward pass
Forward pass
Iterates material batches produced by
EnumerateBatches(). For each batch it binds the material, uploads per-object matrices and property states, and issues indexed draw calls. Camera-relative rendering is enabled by default (CAMERA_RELATIVE = true) to avoid floating-point precision loss at large world coordinates.Shadow maps
Shadow maps
Renders a shadow map
RenderTexture from the primary directional light’s perspective before the main colour pass. The shadow data is uploaded into a shared GraphicsBuffer alongside per-light data and bound as LightBuffer during shading.Procedural sky
Procedural sky
Renders a sky dome mesh with a procedural sky shader (
Defaults/ProceduralSky.shader) before opaque geometry. The sky dome is loaded once from Defaults/SkyDome.obj.Post-processing
Post-processing
After the colour pass, post-process effects are composited through full-screen blit operations using per-camera post-process stacks.
Editor grid and gizmos
Editor grid and gizmos
When
RenderingData.DisplayGrid is true, an infinite grid is rendered using Defaults/Grid.shader. When DisplayGizmo is true, the gizmo wire and solid meshes from Debug’s gizmo builder are drawn on top.Motion vectors (TAA support)
Motion vectors (TAA support)
Tracks per-object model matrices from the previous frame (
prowl_PrevObjectToWorld) and the previous view-projection matrix to support temporal anti-aliasing and motion blur. The matrix cache is cleaned up every 120 frames.Creating a Custom RenderPipeline
SubclassRenderPipeline, override Render, and assign your pipeline to the active camera or engine context.