Skip to content

UBO Foundation Framework >=26.1

The UBO system is used to declare GLSL Uniform Block memory layouts in code and automatically calculate STD140 sizes and padding data.

UboObject

Abstract base class for all custom UBOs.

java
public abstract class UboObject<T extends UboObject<T>> {
    // Subclasses must declare a static DEFINITION constant
    protected abstract UboLayoutDefinition<T> getDefinition();

    // Upload the current object data to a GPU buffer slice using the layout
    public void upload(CommandEncoder encoder, GpuBufferSlice slice);
}

Usage Example

java
public class MyUniform extends UboObject<MyUniform> {
    public static final UboLayoutDefinition<MyUniform> DEFINITION =
        UboLayoutDefinition.create(
            UboLayoutEntry.ofFloat().forGetter(u -> u.intensity).build(),
            UboLayoutEntry.ofVec3f().forGetter(u -> u.color).build(),
            UboLayoutEntry.ofMat4f().forGetter(u -> u.modelMatrix).build()
        );

    public float intensity;
    public Vector3f color;
    public Matrix4f modelMatrix;

    // upload() implementation
    @Override
    public UboLayoutDefinition<MyUniform> getDefinition() {
        return DEFINITION;
    }
}

UboLayoutDefinition

Generic T layout definition, holding a set of UboLayoutEntry.

java
public class UboLayoutDefinition<T> {
    // Create a layout definition
    public static <T> UboLayoutDefinition<T> create(UboLayoutEntry... entries);

    // Write object fields to a ByteBuffer according to the layout
    public void write(ByteBuffer buffer, T object);

    // Return the total byte size of the UBO under STD140
    public int size();
}

UboLayoutEntry

An entry record (UboLayoutEntryType, getter), linking field type to access method.

java
public class UboLayoutEntry<T, I> {
    // Static factory methods
    public static Builder<Float, I> ofFloat();
    public static Builder<Integer, I> ofInt();
    public static Builder<Vector2f, I> ofVec2f();
    public static Builder<Vector3f, I> ofVec3f();
    public static Builder<Vector4f, I> ofVec4f();
    public static Builder<Matrix4f, I> ofMat4f();
}

// Builder chaining
entry = UboLayoutEntry.ofFloat()
    .forGetter(u -> u.intensity)  // Bind getter
    .build();

UboLayoutEntryType

Defines specific STD140 data types:

TypeDescription
FLOATSingle-precision float (4 bytes)
INT32-bit integer (4 bytes)
VEC22-component vector (8 bytes)
VEC33-component vector (16 bytes, STD140 alignment)
VEC44-component vector (16 bytes)
MAT44×4 matrix (64 bytes)

Internally implements acceptSizeCalculator and acceptWriter for size calculation and writing respectively.

STD140 Alignment Rules

  • FLOAT / INT: 4-byte alignment
  • VEC2: 8-byte alignment
  • VEC3 / VEC4: 16-byte alignment
  • MAT4: 16-byte alignment (4 VEC4s)
  • Struct tail padding to multiples of the largest alignment unit

GLSL Correspondence

glsl
// GLSL
layout(std140) uniform MyUniformBlock {
    float intensity;
    vec3 color;
    mat4 modelMatrix;
};

// Java
UboLayoutEntry.ofFloat().forGetter(u -> u.intensity).build()
UboLayoutEntry.ofVec3f().forGetter(u -> u.color).build()
UboLayoutEntry.ofMat4f().forGetter(u -> u.modelMatrix).build()

Released under the CC-BY-NC-SA 4.0 License.