pub struct Shader { /* private fields */ }Implementations§
Source§impl Shader
impl Shader
Sourcepub fn compile(
vertex_src: &str,
fragment_src: &str,
geometry_src: Option<&str>,
) -> Result<Self, String>
pub fn compile( vertex_src: &str, fragment_src: &str, geometry_src: Option<&str>, ) -> Result<Self, String>
Examples found in repository?
examples/transforms.rs (line 41)
25fn main() {
26 let vertices: Vec<GLfloat> = vec![
27 -10.0, 0.0, // bottom-left
28 10.0, 0.0, // bottom-right
29 0.0, 10.0, // top-center
30 ];
31 let values_per_vertex = 2;
32
33 let window = Window::new("Transform", 800, 600);
34 let mut geometry = Geometry::new(GL_TRIANGLES);
35 geometry.add_buffer(&vertices, values_per_vertex);
36 geometry.add_vertex_attribute(Attribute::new(0, 2, 2, 0));
37
38 let vertex_shader_source = include_str!("shaders/transform.vert");
39 let fragment_shader_source = include_str!("shaders/transform.frag");
40
41 let shader = Shader::compile(vertex_shader_source, fragment_shader_source, None)
42 .expect("Failed to compile shader");
43
44 let mut mesh = Mesh::new(Rc::new(shader), geometry);
45 let renderer = Renderer::new(window.handle());
46 let mut app = App::new(window);
47
48 app.on_render(move || {
49 // Get current viewport size in case window was resized
50 let (width, height) = renderer.viewport_size();
51
52 let transform = build_transform(width as f32, height as f32, renderer.get_time());
53 mesh.set_transform(transform);
54
55 renderer.draw_mesh(&mesh)
56 });
57
58 app.run();
59}More examples
examples/triangle.rs (line 41)
7fn main() {
8 let window = Window::new("Hello Window", 800, 600);
9
10
11 let vertex_shader_source = include_str!("shaders/geometry.vert");
12 let fragment_shader_source = include_str!("shaders/geometry.frag");
13
14 /* 5 values per vertex: x,y,r,g,b */
15 let vertices: Vec<GLfloat> = vec![
16 /* bottom right */ 0.5, -0.5, /*color */ 1.0, 0.0, 0.0,
17 /* bottom left */ -0.5, -0.5, /*color */ 0.0, 1.0, 0.0,
18 /* top */ 0.0, 0.5, /*color */ 0.0, 0.0, 1.0,
19 ];
20
21 let position_values_per_vertex = 2;
22 let color_values_per_vertex = 3;
23 let values_per_vertex = 5;
24
25
26 let mut geometry = Geometry::new(GL_TRIANGLES);
27 geometry.add_buffer(&vertices, values_per_vertex);
28
29 let position_attribute =
30 Attribute::new(0, position_values_per_vertex, values_per_vertex as usize, 0);
31 geometry.add_vertex_attribute(position_attribute);
32
33 let color_attribute = Attribute::new(
34 1,
35 color_values_per_vertex,
36 values_per_vertex as usize,
37 position_values_per_vertex as usize,
38 );
39 geometry.add_vertex_attribute(color_attribute);
40
41 let shader = Shader::compile(vertex_shader_source, fragment_shader_source, None)
42 .expect("Failed to compile shader");
43
44 let mesh = Mesh::new(Rc::new(shader), geometry);
45
46 let renderer = Renderer::new(window.handle());
47 let mut app = App::new(window);
48
49 app.on_render(move || {
50 renderer.draw_mesh(&mesh)
51 });
52 app.run();
53}examples/waypoints.rs (lines 45-49)
14fn main() {
15 let wgs84_coordinates = vec![
16 6.1432, 46.2044, // Geneva
17 6.6323, 46.5197, // Lausanne
18 7.4474, 46.9480, // Bern
19 8.2457, 46.8959, // Sarnen
20 8.5417, 47.3769, // Zurich
21 9.8355, 46.4908, // St-Moritz
22 ];
23
24 let mut window = Window::new("Hello, Switzerland", 800, 600);
25
26 window.on_scroll(move |_, y_offset| {
27 MAP_BOUNDS.with(|bounds| {
28 let mut b = bounds.borrow_mut();
29
30 let center_long = (b[0] + b[2]) / 2.0;
31 let center_lat = (b[1] + b[3]) / 2.0;
32 let zoom_factor = if y_offset > 0.0 { 0.95 } else { 1.05 };
33
34 b[0] = center_long + (b[0] - center_long) * zoom_factor;
35 b[1] = center_lat + (b[1] - center_lat) * zoom_factor;
36 b[2] = center_long + (b[2] - center_long) * zoom_factor;
37 b[3] = center_lat + (b[3] - center_lat) * zoom_factor;
38 });
39 });
40
41 let vertex_shader_source = include_str!("shaders/waypoints.vert");
42 let fragment_shader_source = include_str!("shaders/waypoints.frag");
43 let geometry_shader_source = include_str!("shaders/waypoints.geom");
44
45 let shader = Shader::compile(
46 vertex_shader_source,
47 fragment_shader_source,
48 Some(geometry_shader_source),
49 )
50 .expect("Failed to compile shader");
51
52 let mut geometry = Geometry::new(GL_POINTS);
53
54 geometry.add_buffer(&wgs84_coordinates, 2);
55 geometry.add_vertex_attribute(Attribute::new(0, 2, 2usize, 0));
56
57 let mesh = Mesh::new(Rc::new(shader), geometry);
58
59 let renderer = Renderer::new(window.handle());
60 renderer.set_point_size(5.0);
61
62 let mut app = App::new(window);
63
64
65 app.on_render(move || {
66 MAP_BOUNDS.with(|bounds| {
67 mesh.set_uniform_4f("map_bounds", &bounds.borrow());
68 });
69 renderer.draw_mesh(&mesh);
70 });
71 app.run();
72}pub fn use_program(&self)
pub fn program(&self) -> GLuint
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Shader
impl RefUnwindSafe for Shader
impl Send for Shader
impl Sync for Shader
impl Unpin for Shader
impl UnsafeUnpin for Shader
impl UnwindSafe for Shader
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more