# 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)