Reason #1: Can't bind vertex attributes per draw call ---------------------------------------------------------------------- While this can be mostly worked around with shader storage buffers and the Love2D "drawFromShader" API, the format of shader storage buffers must be defined using GLSL types. GLSL has no sized integer or sized float type, which makes it impossible to use, for example, vectors of uint8. uint8 is useful for representing things like Minecraft Block IDs. A workaround for the lack of sized scalars in shader storage buffers is to use bit shifts on GLSL's uint(32) type, but this is fragile as it makes the shader dependent on host endianness. However, this is extremely awkward if a vector of signed 8-bit integers is desired (as in signed Minecraft chunk x/z coordinates). A workaround for this is to perform sign extension manually via GLSL arithmetic.