An open API service indexing awesome lists of open source software.

https://github.com/alexheretic/gfx-shader-watch

Gfx utility for watching shaders and reloading pipeline state on the fly
https://github.com/alexheretic/gfx-shader-watch

Last synced: 3 days ago
JSON representation

Gfx utility for watching shaders and reloading pipeline state on the fly

Awesome Lists containing this project

README

        

gfx_shader_watch
[![crates.io](https://img.shields.io/crates/v/gfx_shader_watch.svg)](https://crates.io/crates/gfx_shader_watch)
[![Documentation](https://docs.rs/gfx_shader_watch/badge.svg)](https://docs.rs/gfx_shader_watch)
================

Tool for [gfx-rs](https://github.com/gfx-rs/gfx) providing a PsoCell container that:
* (Debug mode) Watches for shader file changes and reloads automatically
* (Release mode) Includes shader file bytes at compile time

Watching and auto-loading shader file changes allows faster development of shader code without full program restarts or re-compiles. However, when releasing a final binary it is more convenient to simply include the shader code in source.
Naturally this library can automatically act the desired way.

## How It Works
There are two PsoCell variants `SimplePsoCell` & `WatcherPsoCell`, the former simply builds it's PipelineState once and
provides access. The latter refers to a shader source file that it will monitor, when changed it will reload it's
PipelineState on next access. To facilitate using `SimplePsoCell` in release mode, and `WatcherPsoCell` in debug mode
the `debug_watcher_pso_cell!` & `debug_watcher_pso_cell_type!` macros are available.

Code example:
```rust
#[macro_use] extern crate gfx;
#[macro_use] extern crate gfx_shader_watch;

use gfx_shader_watch::*;
use gfx::Primitive;
use gfx::state::Rasterizer;

pub fn main() {
// {code to setup window / gfx factory etc }

// Container has SimplePsoCell or WatcherPsoCell type, depending on compile mode
// if you need to refer to the type, use the `debug_watcher_pso_cell_type!` macro
let mut pso_cell = debug_watcher_pso_cell!(
pipe = mypipeline,
vertex_shader = "shader/vert.glsl",
fragment_shader = "shader/frag.glsl",
factory = factory,
primitive = Primitive::TriangleList,
raterizer = Rasterizer::new_fill()).expect("psocell");

let mut running = true;
while running {
// ...
encoder.draw(&slice, pso_cell.pso(), &data);
// ...
}
}
```

## Examples
Try running `cargo run --example watch-shaders` you should see a white triangle. Now open `examples/shader/frag.glsl` and modify it (ie change `gl_FragColor = white;` -> `gl_FragColor = red;`). You'll see the triangle shaded with the new code without the program reloading.

## Minimum supported rust compiler
This crate is maintained with [latest stable rust](https://gist.github.com/alexheretic/d1e98d8433b602e57f5d0a9637927e0c).