mirror of
https://github.com/sotrh/learn-wgpu.git
synced 2024-11-08 07:10:33 +00:00
2.5 KiB
2.5 KiB
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 7.6.2.2
In WGPU
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)
Array:
- determine the alignment of the member type and lets name it
align_member
- the alignment of the array is maximum(
align_member
, 16)
Struct:
- 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
std430 (since GLSL 4.3, OpenGL 4.3)
more space efficient for structs and arrays
Array
- alignment is the alignment of the element type
Struct
- alignment is the alignment of the member with the largest alignment
crates to make yuor struct compatible with std430
glsl_layout issue crevice issue