astrelis-render
Modular rendering framework for the Astrelis game engine.
Overview
astrelis-render provides a modular, extensible architecture for managing GPU resources and rendering. It wraps WGPU with higher-level abstractions while maintaining low-level control when needed.
Architecture
Core Modules
context- Graphics context management (device, queue, adapter)window- Window rendering contexts and surface managementframe- Frame lifecycle and render pass buildersrenderer- Low-level extensible renderer for resource management
Design Philosophy
- Modular: Each component has a clear responsibility
- Extensible: Easy to build higher-level renderers (TextRenderer, SceneRenderer, etc.)
- Type-Safe: Leverages Rust's type system for safety
- Zero-Cost: Minimal overhead over raw WGPU
Quick Start
Basic Setup
use ;
use ;
run_app;
Using the Renderer API
use Renderer;
let graphics_ctx = new_sync;
let renderer = new;
// Create shader
let shader = renderer.create_shader;
// Create vertex buffer
let vertices: & = &;
let vertex_buffer = renderer.create_vertex_buffer;
// Create texture
let texture = renderer.create_texture_2d;
// Create sampler
let sampler = renderer.create_linear_sampler;
// Create bind group
let bind_group_layout = renderer.create_bind_group_layout;
let bind_group = renderer.create_bind_group;
Render Loop
API Reference
GraphicsContext
Manages the WGPU instance, adapter, device, and queue.
// Create with defaults
let ctx = new_sync;
// Create with custom descriptor
let ctx = new_with_descriptor.await;
// Query device info
let info = ctx.info;
let limits = ctx.limits;
let features = ctx.features;
WindowContext
Manages a window surface and its configuration.
let window_ctx = new;
// Handle resize
window_ctx.resized;
// Reconfigure surface
window_ctx.reconfigure_surface;
// Access surface
let surface = window_ctx.surface;
let config = window_ctx.surface_config;
Renderer
Low-level API for creating GPU resources.
Buffer Creation
// Vertex buffer
let vertex_buffer = renderer.create_vertex_buffer;
// Index buffer
let index_buffer = renderer.create_index_buffer;
// Uniform buffer
let uniform_buffer = renderer.create_uniform_buffer;
// Update uniform
renderer.update_uniform_buffer;
Texture Creation
// 2D texture with data
let texture = renderer.create_texture_2d;
// Custom texture descriptor
let texture = renderer.create_texture;
Sampler Creation
// Linear sampler
let sampler = renderer.create_linear_sampler;
// Nearest sampler
let sampler = renderer.create_nearest_sampler;
// Custom sampler
let sampler = renderer.create_sampler;
Bind Groups
// Create layout
let layout = renderer.create_bind_group_layout;
// Create bind group
let bind_group = renderer.create_bind_group;
Pipeline Creation
// Create shader
let shader = renderer.create_shader;
// Create pipeline layout
let pipeline_layout = renderer.create_pipeline_layout;
// Create render pipeline
let pipeline = renderer.create_render_pipeline;
// Create compute pipeline
let compute_pipeline = renderer.create_compute_pipeline;
Command Submission
// Create encoder
let mut encoder = renderer.create_command_encoder;
// ... record commands
// Submit
renderer.submit;
RenderPassBuilder
Builder for creating render passes with automatic encoder management.
let mut render_pass = new
.label
.color_attachment
.depth_stencil_attachment
.build;
// Use the render pass
let pass = render_pass.wgpu_pass;
pass.set_pipeline;
// ... render commands
// Encoder automatically returned to frame when dropped
WGPU Re-export
All WGPU types are re-exported for convenience:
use wgpu;
// Instead of:
// use wgpu::TextureFormat;
// You can use:
use TextureFormat;
Building Higher-Level Renderers
The Renderer is designed as a foundation for specialized renderers:
Example Renderer Types
- TextRenderer - Text rendering with font atlases
- SpriteRenderer - 2D sprite batching
- SceneRenderer - 3D scene rendering with lighting
- UIRenderer - Immediate-mode UI rendering
- ParticleRenderer - GPU particle systems
- DebugRenderer - Debug shapes and lines
Examples
See the examples/ directory for complete examples:
renderer_api.rs- Demonstrates the low-level Renderer APItextured_window.rs- Basic textured quad renderingmulti_window.rs- Multiple windows with different content
Run an example:
Features
- Modular Architecture - Clean separation of concerns
- Type-Safe - Compile-time safety with Rust
- Zero-Cost Abstractions - Minimal overhead
- Multi-Window Support - Render to multiple windows
- Extensible - Easy to build specialized renderers
- WGPU Integration - Full access to WGPU features
- Profiling Integration - Built-in profiling support
License
Part of the Astrelis game engine.