8 releases (4 breaking)

0.5.1 Nov 7, 2019
0.5.0 Nov 3, 2019
0.4.1 Oct 14, 2019
0.4.0 Aug 20, 2019
0.1.0 Feb 9, 2019

#95 in Rendering

Download history 405/week @ 2022-10-16 652/week @ 2022-10-23 783/week @ 2022-10-30 928/week @ 2022-11-06 687/week @ 2022-11-13 526/week @ 2022-11-20 393/week @ 2022-11-27 533/week @ 2022-12-04 631/week @ 2022-12-11 595/week @ 2022-12-18 429/week @ 2022-12-25 244/week @ 2023-01-01 503/week @ 2023-01-08 248/week @ 2023-01-15 707/week @ 2023-01-22 658/week @ 2023-01-29

2,129 downloads per month
Used in 29 crates (via rendy)




Helper crate for gfx-hal to create and use meshes with vertex semantics.

Vertex semantics

Vertex formats usually have semantics attached to field names. A common example is for a vertex to be composed of a position, normal, color and texture coordinate field. This crate provides traits and types to have semantics explicitly defined for a vertex at the type level.

Position, Normal, TexCoord etc. are attributes that have unambiguous semantics. Users can define their own attribute types by implementing the Attribute trait.

While the attribute type on its own is a trivial vertex format (with single attribute), complex vertex formats are created by composing attribute types.

The WithAttribute trait allows to get formatting info for individual attributes defined in a vertex format. The Query trait allows to get formatting info for several attributes at once.

VertexFormat queried from vertex formats can be used to build graphics pipelines and bind required vertex buffers from mesh to command buffer.

To define a custom vertex format type, the AsVertexFormat trait must be implemented providing a VertexFormat associated constant.

WithAttribute can be implemented also for all attributes and the VertexFormat associated constant in AsVertexFormat can be defined more clearly by utilizing the WithAttribute implementation. Query is automatically implemented.


Mesh is a collection of vertex buffers and optionally an index buffer together with vertex formats of the buffers and index type. Also there is a primitive type specified which defines how vertices form primitives (lines, triangles etc). To create instances of Mesh you need to use MeshBuilder.

  1. Fill MeshBuilder with typed vertex data.
  2. Provide the index data.
  3. Set the primitive type (Triangles list by default).
  4. Call MeshBuilder::build. It uses Factory from gfx-render to create buffers and upload data.

Here is your fresh new Mesh. Or an Error from gfx-render.

To bind vertex buffers to a command buffer use Mesh::bind with a sorted array of VertexFormats (the same that was used to setup the graphics pipeline).


~138K SLoC