shdrlib 0.1.5

A three-tiered Vulkan shader compilation and rendering framework built in pure Rust
Documentation
# Quick Start Tutorial


Render a triangle in 5 minutes.

## Step 1: Create Project


```bash
cargo new triangle_demo
cd triangle_demo
```

## Step 2: Add Dependencies


```toml
[dependencies]
shdrlib = "0.1"
ash = "0.38"
```

## Step 3: Write Code (EZ Tier)


```rust
use shdrlib::ez::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // One-liner setup
    let mut renderer = EzRenderer::new()?;
    
    // One-liner pipeline
    let pipeline = renderer.quick_pipeline(VERTEX, FRAGMENT)?;
    
    // Render
    renderer.render_frame(|frame| {
        frame.bind_pipeline(pipeline)?;
        frame.set_viewport(0.0, 0.0, 800.0, 600.0);
        frame.set_scissor(0, 0, 800, 600);
        frame.draw(3, 1, 0, 0);
        Ok(())
    })?;
    
    Ok(())
}

const VERTEX: &str = r#"
#version 450

vec2 pos[3] = vec2[](
    vec2(0.0, -0.5),
    vec2(0.5, 0.5),
    vec2(-0.5, 0.5)
);
void main() {
    gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);
}
"#;

const FRAGMENT: &str = r#"
#version 450

layout(location = 0) out vec4 outColor;
void main() {
    outColor = vec4(1.0, 0.5, 0.2, 1.0);
}
"#;
```

## Step 4: Run


```bash
cargo run
```

You have now rendered a triangle with Vulkan.

---

## Next: Add Color


```rust
const VERTEX: &str = r#"
#version 450


layout(location = 0) out vec3 fragColor;

vec2 pos[3] = vec2[](
    vec2(0.0, -0.5), vec2(0.5, 0.5), vec2(-0.5, 0.5)
);

vec3 colors[3] = vec3[](
    vec3(1.0, 0.0, 0.0),  // Red
    vec3(0.0, 1.0, 0.0),  // Green
    vec3(0.0, 0.0, 1.0)   // Blue
);

void main() {
    gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);
    fragColor = colors[gl_VertexIndex];
}
"#;

const FRAGMENT: &str = r#"
#version 450


layout(location = 0) in vec3 fragColor;
layout(location = 0) out vec4 outColor;

void main() {
    outColor = vec4(fragColor, 1.0);
}
"#;
```

---

## Next: Add Vertex Buffer


```rust
#[repr(C)]

#[derive(Copy, Clone)]

struct Vertex {
    pos: [f32; 2],
    color: [f32; 3],
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut renderer = EzRenderer::new()?;
    
    // Create vertex buffer
    let vertices = vec![
        Vertex { pos: [0.0, -0.5], color: [1.0, 0.0, 0.0] },
        Vertex { pos: [0.5, 0.5], color: [0.0, 1.0, 0.0] },
        Vertex { pos: [-0.5, 0.5], color: [0.0, 0.0, 1.0] },
    ];
    let vbuf = renderer.create_vertex_buffer(&vertices)?;
    
    let pipeline = renderer.quick_pipeline(VERTEX, FRAGMENT)?;
    
    renderer.render_frame(|frame| {
        frame.bind_pipeline(pipeline)?;
        frame.bind_vertex_buffers(0, &[vbuf.handle()], &[0]);
        frame.set_viewport(0.0, 0.0, 800.0, 600.0);
        frame.set_scissor(0, 0, 800, 600);
        frame.draw(3, 1, 0, 0);
        Ok(())
    })?;
    
    Ok(())
}

const VERTEX: &str = r#"
#version 450


layout(location = 0) in vec2 inPos;
layout(location = 1) in vec3 inColor;
layout(location = 0) out vec3 fragColor;

void main() {
    gl_Position = vec4(inPos, 0.0, 1.0);
    fragColor = inColor;
}
"#;
```

---

## Next: Try EX Tier


For production code, use EX tier:

```rust
use shdrlib::{core::ShaderStage, ex::*};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Setup
    let mut runtime = RuntimeManager::new(RuntimeConfig::default())?;
    let mut shaders = ShaderManager::new(runtime.device())?;
    
    // Compile shaders
    let vert = shaders.add_shader(VERTEX, ShaderStage::Vertex, "vert")?;
    let frag = shaders.add_shader(FRAGMENT, ShaderStage::Fragment, "frag")?;
    
    // Build pipeline
    let pipeline = shaders.build_pipeline(
        PipelineBuilder::new()
            .vertex_shader(shaders.get_shader(vert)?.handle(), "main")
            .fragment_shader(shaders.get_shader(frag)?.handle(), "main")
            .color_attachment_formats(vec![ash::vk::Format::R8G8B8A8_UNORM]),
        "triangle"
    )?;
    
    // Render loop
    loop {
        let frame = runtime.begin_frame()?;
        // ... record commands ...
        runtime.end_frame(&Default::default())?;
    }
}
```

See [EX Tier Guide](../guides/ex-tier-guide.md) for full examples.

## More Examples


```bash
# EZ tier

cargo run --bin ez_01_hello_triangle
cargo run --bin ez_02_compute_multiply
cargo run --bin ez_03_buffers_demo

# EX tier

cargo run --bin ex_01_triangle_100_lines
cargo run --bin ex_03_textured_quad

# CORE tier

cargo run --bin 01_triangle_raw
```

---

## Next Steps


- **Learn more:** [EZ Tier Guide]../guides/ez-tier-guide.md
- **Production:** [EX Tier Guide]../guides/ex-tier-guide.md
- **API Reference:** `cargo doc --open`
- **Troubleshooting:** [Common Issues]troubleshooting.md