1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| # use sb7::application::*; # # #[derive(Default)] # struct App { # vao: u32, # pipeline: u32, # } # # unsafe fn init_pipeline() -> Result<u32, Box<dyn std::error::Error>> { # let vs_src = std::ffi::CString::new( # "#version 460 core # # out vec4 vs_color; # # void main(void) # { # const vec4 vertices[3] = { # vec4( 0.5, -0.5, 0.0, 1.0), # vec4(-0.5, -0.5, 0.0, 1.0), # vec4( 0.0, 0.5, 0.0, 1.0) # }; # # const vec4 colors[3] = { # vec4(1.0, 0.0, 0.0, 1.0), # vec4(0.0, 1.0, 0.0, 1.0), # vec4(0.0, 0.0, 1.0, 1.0), # }; # # gl_Position = vertices[gl_VertexID]; # vs_color = colors[gl_VertexID]; # }", # )?; # let vs = gl::CreateShader(gl::VERTEX_SHADER); gl::ShaderSource(vs, 1, &vs_src.as_ptr(), std::ptr::null()); gl::CompileShader(vs); # # let fs_src = std::ffi::CString::new( # "#version 460 core # # layout (location = 0) out vec4 color; # in vec4 vs_color; # # void main(void) # { # color = vs_color; # }", # )?; # let fs = gl::CreateShader(gl::FRAGMENT_SHADER); gl::ShaderSource(fs, 1, &fs_src.as_ptr(), std::ptr::null()); gl::CompileShader(fs);
let vs_prog = gl::CreateProgram(); gl::AttachShader(vs_prog, vs); gl::ProgramParameteri(vs_prog, gl::PROGRAM_SEPARABLE, gl::TRUE as _); gl::LinkProgram(vs_prog);
let fs_prog = gl::CreateProgram(); gl::AttachShader(fs_prog, fs); gl::ProgramParameteri(fs_prog, gl::PROGRAM_SEPARABLE, gl::TRUE as _); gl::LinkProgram(fs_prog);
let mut pipeline = 0; gl::CreateProgramPipelines(1, &mut pipeline); gl::UseProgramStages(pipeline, gl::VERTEX_SHADER_BIT, vs_prog); gl::UseProgramStages(pipeline, gl::FRAGMENT_SHADER_BIT, fs_prog);
gl::DeleteShader(vs); gl::DeleteShader(fs); gl::DeleteProgram(vs_prog); gl::DeleteProgram(fs_prog);
# Ok(pipeline) # } # # impl Application for App { # fn startup(&mut self) { # unsafe { # let mut vao = 0; # gl::CreateVertexArrays(1, &mut vao); # gl::BindVertexArray(vao); # # let pipeline = init_pipeline().unwrap(); gl::BindProgramPipeline(pipeline); # # *self = Self { vao, pipeline } # } # } # # fn render(&self, _current_time: f64) { # unsafe { # gl::ClearBufferfv(gl::COLOR, 0, [0.0, 0.0, 0.0, 1.0].as_ptr()); # gl::DrawArrays(gl::TRIANGLES, 0, 3); # } # } # # fn shutdown(&mut self) { # unsafe { # gl::DeleteProgramPipelines(1, &self.pipeline); # gl::DeleteVertexArrays(1, &self.vao); # } # } # } # # fn main() { # App::default().run(); # }
|