Documentation
layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec2 vertexTexCoord;

uniform mat4 viewProjectionMatrix;
uniform mat4 worldMatrix;
uniform vec3 cameraUpVector;
uniform vec3 cameraSideVector;
uniform float size;
uniform float rotation;

out vec2 texCoord;

vec2 rotateVec2(vec2 v, float angle)
{
    float c = cos(angle);
    float s = sin(angle);
    mat2 m = mat2(c, -s, s, c);
    return m * v;
}

void main()
{
    texCoord = vertexTexCoord;
    vec2 vertexOffset = rotateVec2(vertexTexCoord * 2.0 - 1.0, rotation);
    vec4 worldPosition = worldMatrix * vec4(vertexPosition, 1.0);
    vec3 offset = (vertexOffset.x * cameraSideVector + vertexOffset.y * cameraUpVector) * size;
    gl_Position = viewProjectionMatrix * (worldPosition + vec4(offset.x, offset.y, offset.z, 0.0));
}