Expand description
§PlumeSplat
Advanced terrain and mesh splatting for Bevy Engine with support for up to 256 materials in a single draw call.
PlumeSplat extends Bevy’s StandardMaterial with texture array splatting, enabling
complex multi-material terrains with full PBR lighting support.
§Features
- 256 Material Support: Blend up to 256 materials using texture arrays and per-vertex indices
- Single Draw Call: All materials rendered efficiently in one draw call
- Full PBR Integration: Extends
StandardMaterialfor proper lighting, shadows, and reflections - Triplanar Mapping: UV-less texturing that works on arbitrary geometry without seams
- Normal Maps: Per-material normal mapping for detailed surfaces
- Packed PBR Textures: Support for metallic, roughness, ambient occlusion, and height maps
- Stochastic Tiling: Eliminates visible texture repetition patterns
- Height-Based Blending: Natural material transitions based on height maps
- Builder API: Ergonomic API for creating materials from individual textures
§Quick Start (Builder API - Recommended)
The easiest way to use PlumeSplat is with the builder API:
use bevy::prelude::*;
use plumesplat::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(PlumeSplatPlugin)
.add_systems(Startup, setup)
.run();
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
asset_server: Res<AssetServer>,
) {
// Define material layers
let grass = MaterialLayer::new(asset_server.load("grass.png"));
let dirt = MaterialLayer::new(asset_server.load("dirt.png"));
let rock = MaterialLayer::new(asset_server.load("rock.png"))
.with_normal(asset_server.load("rock_normal.png"));
// Build the pending material
let pending = SplatMaterialBuilder::new()
.add_layer(grass)
.add_layer(dirt)
.add_layer(rock)
.with_uv_scale(2.0)
.build();
// Spawn with mesh - material auto-creates when textures load
commands.spawn((
Mesh3d(meshes.add(Cuboid::default())),
pending,
));
}§Vertex Attributes
Meshes must include custom vertex attributes specifying material indices and blend weights:
use plumesplat::prelude::*;
// Create per-vertex material data
let vertices = vec![
MaterialVertex::single(0), // 100% material 0
MaterialVertex::blend2(0, 1, 0.5), // 50% material 0, 50% material 1
MaterialVertex::blend4([0, 1, 2, 3], [0.4, 0.3, 0.2, 0.1]),
];
// Encode for the GPU
let (indices, weights) = encode_material_data(&vertices);
// Add to your mesh
// mesh.insert_attribute(ATTRIBUTE_MATERIAL_INDICES, indices);
// mesh.insert_attribute(ATTRIBUTE_MATERIAL_WEIGHTS, weights);§Key Types
PlumeSplatPlugin: The Bevy plugin that registers shaders and the materialPlumeSplatMaterial: The extended material type for terrain splattingPlumeSplatExtension: Material extension with texture arrays and settingsMaterialVertex: Per-vertex material data for blendingSplatMaterialBuilder: Ergonomic builder API for creating materials
Modules§
- prelude
- Convenient imports for common PlumeSplat types.
Structs§
- Material
Layer - A single material layer defining textures for one terrain type.
- Material
Vertex - Per-vertex material data for terrain splatting.
- Pending
Splat Material - Component marking an entity as having a pending splat material.
- Plume
Splat Extension - Material extension that adds texture array splatting to StandardMaterial.
- Plume
Splat Plugin - Bevy plugin that enables PlumeSplat terrain splatting.
- Plume
Splat Settings - Shader uniform settings for PlumeSplat rendering.
- Splat
Material Builder - Builder for creating
PendingSplatMaterialwith a fluent API.
Constants§
- ATTRIBUTE_
MATERIAL_ INDICES - Custom vertex attribute storing 4 material indices packed into a
u32. - ATTRIBUTE_
MATERIAL_ WEIGHTS - Custom vertex attribute storing 4 blend weights packed into a
u32.
Functions§
- encode_
material_ data - Encodes material data for a slice of vertices into packed
u32vectors. - pack_
u8x4 - Packs four
u8values into a singleu32. - unpack_
u8x4 - Unpacks a
u32into fouru8values.
Type Aliases§
- Plume
Splat Material - Type alias for the complete PlumeSplat material.