build.rs
1 use shaderc::{CompileOptions, Compiler}; 2 use std::{ffi::OsString, fs, path::PathBuf}; 3 4 fn main() { 5 println!("cargo::rerun-if-changed=src/resources/shaders/"); 6 7 let compiler = Compiler::new().unwrap(); 8 let mut options = CompileOptions::new().unwrap(); 9 options.add_macro_definition("EP", Some("main")); 10 11 // Vec of vertex shaders 12 let mut vertex_shaders: Vec<(OsString, String)> = vec![]; 13 // Vec of fragment shaders 14 let mut fragment_shaders: Vec<(OsString, String)> = vec![]; 15 16 // Go through every shader in the shaders folder 17 for file in fs::read_dir("src/resources/shaders").unwrap() { 18 let file_name = file.as_ref().unwrap().file_name(); 19 if let Some(ending) = file_name.to_str().unwrap().rsplit_once('.') { 20 match ending.1 { 21 "vert" => { 22 vertex_shaders.push(( 23 file_name, 24 fs::read_to_string(file.unwrap().path()) 25 .expect("Vertex shader should be a text file"), 26 )); 27 } 28 "frag" => { 29 fragment_shaders.push(( 30 file_name, 31 fs::read_to_string(file.unwrap().path()) 32 .expect("Fragment shader should be a text file"), 33 )); 34 } 35 _ => (), 36 } 37 } 38 } 39 40 let out_dir: PathBuf = PathBuf::from(std::env::var("OUT_DIR").unwrap()); 41 42 // Compile each shader and output to the out_dir 43 for vertex_shader in vertex_shaders { 44 let file_name = vertex_shader.0.to_str().unwrap(); 45 let shader = compiler 46 .compile_into_spirv( 47 &vertex_shader.1, 48 shaderc::ShaderKind::Vertex, 49 file_name, 50 "main", 51 Some(&options), 52 ) 53 .unwrap(); 54 let binary = shader.as_binary_u8(); 55 fs::write(out_dir.join(file_name), binary).unwrap(); 56 } 57 58 for fragment_shader in fragment_shaders { 59 let file_name = fragment_shader.0.to_str().unwrap(); 60 println!("Compiling {file_name}"); 61 let shader = compiler 62 .compile_into_spirv( 63 &fragment_shader.1, 64 shaderc::ShaderKind::Fragment, 65 file_name, 66 "main", 67 Some(&options), 68 ) 69 .unwrap(); 70 let binary = shader.as_binary_u8(); 71 fs::write(out_dir.join(file_name), binary).unwrap(); 72 } 73 }