Ash Renderer
A Vulkan rendering library built with ash. This project explores modern graphics techniques (GPU culling, SSGI, Bindless resources) in a standalone, ECS-free architecture.
[!NOTE] This is still very much a "work in progress." Expect breaking changes and occasional Vulkan validation errors if you feed it weird data. Stable Versions: 0.1.2, 0.3.8, 0.3.9, 0.4.0, 0.4.1, 0.4.2, 0.4.3, 0.4.4, 0.4.9.
Features
- Core Renderer: Basic PBR metallic/roughness workflow.
- Occlusion Culling: Hi-Z based visibility testing (GPU driven).
- GPU Culling: Frustum culling and indirect draw call generation.
- Lighting: Cascaded Shadow Mapping (CSM) and Screen-Space Global Illumination (SSGI).
- Bindless Architecture: Full bindless texture support with 16,384 slots.
- Texture Compression: CPU-side BC7 (albedo) and BC5 (normals) compression for 4x+ VRAM savings.
- Post-Processing: Tonemapping, Bloom, and internal VSR (Temporal upscaling) support.
- GPU Skinning: Linear blend skinning (LBS) with compute-based joint updates and double-buffering.
- Headless: Decoupled from windowing via
SurfaceProvider.
Quick Start (Winit 0.30)
The renderer is designed to be used with winit's ApplicationHandler. Here is a minimal setup:
use *;
use ;
Status
| Feature | Status |
|---|---|
| Material System | Functional (Basic PBR) |
| Shadows | Working, but cascades need tuning |
| SSGI | Experimental (Expect noise) |
| VSR (Temporal Upscaling) | Implemented (basic jitter patterns, needs refinement) |
| GPU Skinning | Stable (Double-buffered, 1024 bone limit) |
| GLTF Loading | Basic support via gltf crate |
| Stability | Dev-grade (Validation layers recommended during dev) |
Examples
# Basic cube with PBR
# GLTF loading (experimental)
API Usage: Skeletal Animation
The skeletal animation API uses explicit updates for safety and performance. Note the unsafe requirement for buffer updates.
// 1. Update Joint Matrices (Unsafe because it writes directly to mapped GPU memory)
let joints: & = ...; // Your calculated joint matrices
unsafe
// 2. Draw Skinned Mesh
renderer.draw_skinned_mesh;
Requirements
- Rust: 1.70+
- Vulkan: 1.2+ (Requires support for dynamic indexing and descriptor indexing)
Licensed under Apache 2.0.