#version 300 es layout(location = 0) in vec2 aQuadPos; // shared unit quad, centered (-0.5..+0.5) layout(location = 1) in vec2 aTexCoord; // quad-corner uv; v=0 = image top (same mapping as sprites) layout(location = 2) in vec3 aPos; // per-instance: world center layout(location = 3) in float aSize; // per-instance: world diameter layout(location = 4) in vec4 aColor; layout(location = 5) in vec4 aUVRect; // per-instance: uvMin.xy, uvMax.zw (atlas region) layout(location = 6) in vec2 aCosSin; // per-instance: in-plane rotation (the uv stays put, so the image spins) #include "_graphics_uniforms.glsl" #include "_billboard.glsl" #include "_fog.glsl" out vec2 vTexCoord; out vec4 vColor; void main() { vec3 world = billboardWorld(aPos, aQuadPos, aCosSin, aSize); gl_Position = u_viewProjection * vec4(world, 1.0); // additive fog fades the added light, RGB only — alpha isn't light vTexCoord = mix(aUVRect.xy, aUVRect.zw, aTexCoord); vColor = vec4(aColor.rgb * (1.0 - fogFactor(aPos)), aColor.a); }