Skip to main content

Shader

Struct Shader 

Source
pub struct Shader { /* private fields */ }

Implementations§

Source§

impl Shader

Source

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
Hide additional 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}
Source

pub fn use_program(&self)

Source

pub fn program(&self) -> GLuint

Trait Implementations§

Source§

impl Drop for Shader

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.