Struct glium::vertex::VertexBuffer
source · pub struct VertexBuffer<T>where
T: Copy,{ /* private fields */ }
Expand description
A list of vertices loaded in the graphics card’s memory.
Implementations§
source§impl<T> VertexBuffer<T>where
T: Vertex,
impl<T> VertexBuffer<T>where T: Vertex,
sourcepub fn new<F>(facade: &F, data: &[T]) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn new<F>(facade: &F, data: &[T]) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds a new vertex buffer.
Note that operations such as write
will be very slow. If you want to modify the buffer
from time to time, you should use the dynamic
function instead.
Example
#[derive(Copy, Clone)]
struct Vertex {
position: [f32; 3],
texcoords: [f32; 2],
}
implement_vertex!(Vertex, position, texcoords);
let vertex_buffer = glium::VertexBuffer::new(&display, &[
Vertex { position: [0.0, 0.0, 0.0], texcoords: [0.0, 1.0] },
Vertex { position: [5.0, -3.0, 2.0], texcoords: [1.0, 0.0] },
]);
sourcepub fn dynamic<F>(
facade: &F,
data: &[T]
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn dynamic<F>( facade: &F, data: &[T] ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds a new vertex buffer.
This function will create a buffer that is intended to be modified frequently.
sourcepub fn persistent<F>(
facade: &F,
data: &[T]
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn persistent<F>( facade: &F, data: &[T] ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds a new vertex buffer.
sourcepub fn immutable<F>(
facade: &F,
data: &[T]
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn immutable<F>( facade: &F, data: &[T] ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds a new vertex buffer.
sourcepub fn empty<F>(
facade: &F,
elements: usize
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn empty<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds an empty vertex buffer.
The parameter indicates the number of elements.
sourcepub fn empty_dynamic<F>(
facade: &F,
elements: usize
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn empty_dynamic<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds an empty vertex buffer.
The parameter indicates the number of elements.
sourcepub fn empty_persistent<F>(
facade: &F,
elements: usize
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn empty_persistent<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds an empty vertex buffer.
The parameter indicates the number of elements.
sourcepub fn empty_immutable<F>(
facade: &F,
elements: usize
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub fn empty_immutable<F>( facade: &F, elements: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds an empty vertex buffer.
The parameter indicates the number of elements.
source§impl<T> VertexBuffer<T>where
T: Copy,
impl<T> VertexBuffer<T>where T: Copy,
sourcepub unsafe fn new_raw<F>(
facade: &F,
data: &[T],
bindings: VertexFormat,
elements_size: usize
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub unsafe fn new_raw<F>( facade: &F, data: &[T], bindings: VertexFormat, elements_size: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Builds a new vertex buffer from an indeterminate data type and bindings.
Example
use std::borrow::Cow;
let bindings = Cow::Owned(vec![(
Cow::Borrowed("position"), 0,
glium::vertex::AttributeType::F32F32,
), (
Cow::Borrowed("color"), 2 * ::std::mem::size_of::<f32>(),
glium::vertex::AttributeType::F32,
),
]);
let data = vec![
1.0, -0.3, 409.0,
-0.4, 2.8, 715.0f32
];
let vertex_buffer = unsafe {
glium::VertexBuffer::new_raw(&display, &data, bindings, 3 * ::std::mem::size_of::<f32>())
};
sourcepub unsafe fn new_raw_dynamic<F>(
facade: &F,
data: &[T],
bindings: VertexFormat,
elements_size: usize
) -> Result<VertexBuffer<T>, CreationError>where
F: Facade + ?Sized,
pub unsafe fn new_raw_dynamic<F>( facade: &F, data: &[T], bindings: VertexFormat, elements_size: usize ) -> Result<VertexBuffer<T>, CreationError>where F: Facade + ?Sized,
Dynamic version of new_raw
.
sourcepub fn slice<R: RangeArgument<usize>>(
&self,
range: R
) -> Option<VertexBufferSlice<'_, T>>
pub fn slice<R: RangeArgument<usize>>( &self, range: R ) -> Option<VertexBufferSlice<'_, T>>
Accesses a slice of the buffer.
Returns None
if the slice is out of range.
sourcepub fn get_bindings(&self) -> &VertexFormat
pub fn get_bindings(&self) -> &VertexFormat
Returns the associated VertexFormat
.
sourcepub fn per_instance(&self) -> Result<PerInstance<'_>, InstancingNotSupported>
pub fn per_instance(&self) -> Result<PerInstance<'_>, InstancingNotSupported>
Creates a marker that instructs glium to use multiple instances.
Instead of calling surface.draw(&vertex_buffer, ...)
you can call
surface.draw(vertex_buffer.per_instance(), ...)
. This will draw one instance of the
geometry for each element in this buffer. The attributes are still passed to the
vertex shader, but each entry is passed for each different instance.
source§impl<T> VertexBuffer<T>where
T: Copy + Send + 'static,
impl<T> VertexBuffer<T>where T: Copy + Send + 'static,
sourcepub fn into_vertex_buffer_any(self) -> VertexBufferAny
pub fn into_vertex_buffer_any(self) -> VertexBufferAny
DEPRECATED: use .into()
instead.
Discard the type information and turn the vertex buffer into a VertexBufferAny
.
Methods from Deref<Target = Buffer<[T]>>§
sourcepub fn get_context(&self) -> &Rc<Context>
pub fn get_context(&self) -> &Rc<Context>
Returns the context corresponding to this buffer.
sourcepub fn is_persistent(&self) -> bool
pub fn is_persistent(&self) -> bool
Returns true if this buffer uses persistent mapping.
sourcepub fn write(&self, data: &T)
pub fn write(&self, data: &T)
Uploads some data in this buffer.
Implementation
- For persistent-mapped buffers, waits untils the data is no longer used by the GPU then memcpies the data to the mapping.
- For immutable buffers, creates a temporary buffer that contains the data then calls
glCopyBufferSubData
to copy from the temporary buffer to the real one. - For other types, calls
glBufferSubData
.
Panic
Panics if the length of data
is different from the length of this buffer.
sourcepub fn invalidate(&self)
pub fn invalidate(&self)
Invalidates the content of the buffer. The data becomes undefined.
You should call this if you only use parts of a buffer. For example if you want to use the first half of the buffer, you invalidate the whole buffer then write the first half.
This operation is a no-op if the backend doesn’t support it and for persistent-mapped buffers.
Implementation
Calls glInvalidateBufferData
if supported. Otherwise, calls glBufferData
with a null
pointer for data. If glBufferStorage
has been used to create the buffer and
glInvalidateBufferData
is not supported, does nothing.
sourcepub fn map(&mut self) -> Mapping<'_, T>
pub fn map(&mut self) -> Mapping<'_, T>
Maps the buffer in memory for both reading and writing.
Implementation
- For persistent-mapped buffers, waits until the data is no longer accessed by the GPU then returns a pointer to the existing mapping.
- For immutable buffers, creates a temporary buffer containing the data of the buffer and maps it. When the mapping object is destroyed, copies the content of the temporary buffer to the real buffer.
- For other types, calls
glMapBuffer
orglMapSubBuffer
.
sourcepub fn map_read(&mut self) -> ReadMapping<'_, T>
pub fn map_read(&mut self) -> ReadMapping<'_, T>
Maps the buffer in memory for reading.
Implementation
- For persistent-mapped buffers, waits until the data is no longer accessed by the GPU then returns a pointer to the existing mapping.
- For immutable buffers, creates a temporary buffer containing the data of the buffer and maps it.
- For other types, calls
glMapBuffer
orglMapSubBuffer
.
sourcepub fn map_write(&mut self) -> WriteMapping<'_, T>
pub fn map_write(&mut self) -> WriteMapping<'_, T>
Maps the buffer in memory for writing only.
Implementation
- For persistent-mapped buffers, waits until the data is no longer accessed by the GPU then returns a pointer to the existing mapping.
- For immutable buffers, creates a temporary buffer and maps it. When the mapping object is destroyed, copies the content of the temporary buffer to the real buffer.
- For other types, calls
glMapBuffer
orglMapSubBuffer
.
sourcepub fn copy_to<'a, S>(&self, target: S) -> Result<(), CopyError>where
S: Into<BufferSlice<'a, T>>,
T: 'a,
pub fn copy_to<'a, S>(&self, target: S) -> Result<(), CopyError>where S: Into<BufferSlice<'a, T>>, T: 'a,
Copies the content of the buffer to another buffer.
Panic
Panics if T
is unsized and the other buffer is too small.
sourcepub unsafe fn slice_custom<F, R>(&self, f: F) -> BufferSlice<'_, R>where
F: for<'r> FnOnce(&'r T) -> &'r R,
R: Content + ?Sized,
pub unsafe fn slice_custom<F, R>(&self, f: F) -> BufferSlice<'_, R>where F: for<'r> FnOnce(&'r T) -> &'r R, R: Content + ?Sized,
Builds a slice that contains an element from inside the buffer.
This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.
Example
#[derive(Copy, Clone)]
struct BufferContent {
value1: u16,
value2: u16,
}
let slice = unsafe { buffer.slice_custom(|content| &content.value2) };
Safety
The object whose reference is passed to the closure is uninitialized. Therefore you must not access the content of the object.
You must return a reference to an element from the parameter. The closure must not panic.
sourcepub unsafe fn slice_custom_mut<F, R>(&mut self, f: F) -> BufferMutSlice<'_, R>where
F: for<'r> FnOnce(&'r T) -> &'r R,
R: Content + ?Sized,
pub unsafe fn slice_custom_mut<F, R>(&mut self, f: F) -> BufferMutSlice<'_, R>where F: for<'r> FnOnce(&'r T) -> &'r R, R: Content + ?Sized,
Same as slice_custom
but returns a mutable slice.
This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.
sourcepub fn as_slice(&self) -> BufferSlice<'_, T>
pub fn as_slice(&self) -> BufferSlice<'_, T>
Builds a slice containing the whole subbuffer.
This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.
sourcepub fn as_mut_slice(&mut self) -> BufferMutSlice<'_, T>
pub fn as_mut_slice(&mut self) -> BufferMutSlice<'_, T>
Builds a slice containing the whole subbuffer.
This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.
sourcepub fn as_slice_any(&self) -> BufferAnySlice<'_>
pub fn as_slice_any(&self) -> BufferAnySlice<'_>
Builds a slice-any containing the whole subbuffer.
This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.
sourcepub fn slice<R: RangeArgument<usize>>(
&self,
range: R
) -> Option<BufferSlice<'_, [T]>>
pub fn slice<R: RangeArgument<usize>>( &self, range: R ) -> Option<BufferSlice<'_, [T]>>
Builds a slice of this subbuffer. Returns None
if out of range.
This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.
sourcepub fn slice_mut<R: RangeArgument<usize>>(
&mut self,
range: R
) -> Option<BufferMutSlice<'_, [T]>>
pub fn slice_mut<R: RangeArgument<usize>>( &mut self, range: R ) -> Option<BufferMutSlice<'_, [T]>>
Builds a slice of this subbuffer. Returns None
if out of range.
This method builds an object that represents a slice of the buffer. No actual operation OpenGL is performed.
sourcepub fn read_as_texture_1d<S>(&self) -> Result<S, ReadError>where
S: Texture1dDataSink<T>,
pub fn read_as_texture_1d<S>(&self) -> Result<S, ReadError>where S: Texture1dDataSink<T>,
Reads the content of the buffer.
Trait Implementations§
source§impl<T> Deref for VertexBuffer<T>where
T: Copy,
impl<T> Deref for VertexBuffer<T>where T: Copy,
source§impl<T> DerefMut for VertexBuffer<T>where
T: Copy,
impl<T> DerefMut for VertexBuffer<T>where T: Copy,
source§impl<'a, T> From<&'a VertexBuffer<T>> for BufferSlice<'a, [T]>where
T: Copy,
impl<'a, T> From<&'a VertexBuffer<T>> for BufferSlice<'a, [T]>where T: Copy,
source§fn from(b: &'a VertexBuffer<T>) -> BufferSlice<'a, [T]>
fn from(b: &'a VertexBuffer<T>) -> BufferSlice<'a, [T]>
source§impl<'a, T> From<&'a mut VertexBuffer<T>> for BufferMutSlice<'a, [T]>where
T: Copy,
impl<'a, T> From<&'a mut VertexBuffer<T>> for BufferMutSlice<'a, [T]>where T: Copy,
source§fn from(b: &'a mut VertexBuffer<T>) -> BufferMutSlice<'a, [T]>
fn from(b: &'a mut VertexBuffer<T>) -> BufferMutSlice<'a, [T]>
source§impl<T> From<VertexBuffer<T>> for VertexBufferAnywhere
T: Copy + Send + 'static,
impl<T> From<VertexBuffer<T>> for VertexBufferAnywhere T: Copy + Send + 'static,
source§fn from(buf: VertexBuffer<T>) -> VertexBufferAny
fn from(buf: VertexBuffer<T>) -> VertexBufferAny
source§impl<T: Copy> GlObject for VertexBuffer<T>
impl<T: Copy> GlObject for VertexBuffer<T>
source§impl<'a, T> IntoVerticesSource<'a> for &'a VertexBuffer<T>where
T: Copy,
impl<'a, T> IntoVerticesSource<'a> for &'a VertexBuffer<T>where T: Copy,
source§fn into_vertices_source(self) -> VerticesSource<'a>
fn into_vertices_source(self) -> VerticesSource<'a>
VerticesSource
.