Vertex attribute slot the optional normal stream is bound to (§53, §68) —
fixed by layout(location = 1) exactly as the position slot is, and for the
same reasons. Location 1 collides with nothing: the particle pipeline's
instance attributes live in its own vertex arrays (attribute bindings are
VAO state), and gl-geometry.ts's arrays bind this slot only when the
geometry carries normals. A program that does not declare the slot (unlit,
sprite) simply ignores an enabled stream; the lit program run over a
geometry that never enabled it reads GL's constant default (0, 0, 0, 1),
which the lit fragment stage treats as "no normal — ambient only".
Vertex attribute slot the optional normal stream is bound to (§53, §68) — fixed by
layout(location = 1)exactly as the position slot is, and for the same reasons. Location 1 collides with nothing: the particle pipeline's instance attributes live in its own vertex arrays (attribute bindings are VAO state), andgl-geometry.ts's arrays bind this slot only when the geometry carries normals. A program that does not declare the slot (unlit, sprite) simply ignores an enabled stream; the lit program run over a geometry that never enabled it reads GL's constant default(0, 0, 0, 1), which the lit fragment stage treats as "no normal — ambient only".