dorkhub

bevy_wind_waker_shader

A toon shader that looks like the one used for characters in The Legend of Zelda: The Wind Waker

janhohenheim
Rust874 forksApache-2.0updated 6 months ago
git clone https://github.com/janhohenheim/bevy_wind_waker_shader.gitjanhohenheim/bevy_wind_waker_shader

Wind Waker Shader

crates.io docs.rs

A toon shader that looks like the one used for characters in The Legend of Zelda: The Wind Waker. The main code is taken from the ideas presented in this video.

Showcase

Sphere:

Sphere

Scene throughout day:

wind_waker.mp4

Scene in daylight:

Scene in daylight

Scene at night:

Scene at night

Functionality

The shader has the following properties:

  • It is a toon shader with only two colors: the highlight and the shadow.
  • The edge between the two colors is not entirely hard but has an ever-so-slight gradient.
  • The color palette used is based on the time of day and the weather.
  • The model has a rim highlight on the edge to make it pop.

All colors and the texture mask are taken from The Legend of Zelda: The Wind Waker.

Differences to The Wind Waker:

  • This shader supports multiple light sources, like in Breath of the Wild. The original Wind Waker only supports a single light source.
  • The rim highlight also comes from Breath of the Wild.
  • The Wind Waker uses even more weather conditions, but I find most of them too specific to include in this shader.

Keep in mind this shader only replicates what is seen on the characters in The Wind Waker, not the environment!

Example

use bevy::prelude::*;
use bevy_wind_waker_shader::prelude::*;

fn main() {
    App::new()
        .add_plugins((DefaultPlugins, WindWakerShaderPlugin::default()))
        .add_systems(Startup, spawn_character)
        .run();
}

fn spawn_character(mut commands: Commands, asset_server: Res<AssetServer>) {
    commands.spawn((
        SceneRoot(asset_server.load("models/Fox.glb")),
        WindWakerShaderBuilder::default()
            .time_of_day(TimeOfDay::Day)
            .weather(Weather::Sunny)
            .build(),

    ));
}

Compatibility

bevy bevy_wind_waker_shader
0.18 0.6
0.17 0.5
0.16 0.4
0.15 0.3
0.14 0.2
0.13 0.1

more like this

anne-key

Firmware for Anne Pro Keyboard written in Rust

Rust572

TachiSnap

TachiSnap — Pixel Snapper for animation pixel artists. Rust + WebAssembly client-side tool for cleaning up AI-generated…

HTML50

bit_gossip

Pathfinding library for calculating all node pairs' shortest paths in an unweighted undirected graph.

Rust50

search

search projects, people, and tags