# Memory Layout in GLSL

# Alignments

The address of the position of an instance in memory has to a multiple of its alignment.

Normally alignment is the same as size. Exceptions are vec3, structs and arrays.

A vec3 is padded to be a vec4 which means it behaves as if it was a vec4 just that the last entry is not used.

{i,u,b}vec is shorthand for ivec, uvec, bvec so a vector of int or uint or bool. A vec is a vec of float.

type Alignment in bytes size in bytes
int, uint, float, bool 4 4
double 8 8
{i,u,b}vec2 8 8
dvec2 16 16
{i,u,b}vec3 16 12
{i,u,b}vec4 16 16
dvec3 32 24
dvec4 32 32
mat3 (like array of 3 vec3) 16 3*16
mat4 (like array of 4 vec4) 16 4*16

Reference section


To make uniform buffers portable they have to be std140 and not std430. Uniform structs have to be std140. Storage structs have to be std430.

Storage buffers for compute shaders can be std140 or std430.

# std140 (since GLSL 1.4, OpenGL 3.1)


  • determine the alignment of the member type and lets name it align_member
  • the alignment of the array is maximum(align_member, 16)


  • determine the member with the largest alignment and lets name it max_member_align
  • the alignment of the array is maximum(max_member_align, 16)

# crates to make your struct compatible with std140

glsl_layout crevice

# std430 (since GLSL 4.3, OpenGL 4.3)

more space efficient for structs and arrays


  • alignment is the alignment of the element type


  • alignment is the alignment of the member with the largest alignment

# crates to make yuor struct compatible with std430

glsl_layout issue crevice issue

Last Updated: 11/25/2021, 10:32:37 PM