То, что вы описываете, в коде шейдера называется swizzling. Это удобный способ, предлагаемый языком для доступа к компонентам вектора. Определены различные методы доступа, соответствующие синтаксису: rgba, xyzw, stpq.
Более подробную информацию можно найти по https://www.khronos.org/opengl/wiki/Data_Type_ (GLSL) # Swizzling
vec4 aVector;
vec4 color = aVector.rgba;
vec4 coordinates = aVector.xyzw;
vec4 textures = aVector.stpq;
Но вы также можете играть так, как вы хотите, с помощью этих средств доступа, чтобы создавать векторы разных размеров, или использовать компоненты в нужном вам порядке.
vec4 point;
vec2 projected = point.xy;
vec2 orthogonal = point.yx;
vec4 aVector;
vec2 textureCoord = aVector.st;
vec4 color;
vec3 grayscale = color.rrr;
vec3 colorRGB;
vec3 colorBGR = colorRGB.bgr;
В вашем случае gl_Position - это встроенный vec4. во встроенном вершинном шейдере, который должен быть установлен с 4-мерным вектором пространства клипа.
Ваш код преобразует атрибут 2D-вершины a_position в значение пространства 4D-клипа.
gl_Position = vec4((u_matrix * vec3(a_position,1)).xy,0,1);
Давайте перепишем этот код, чтобы лучше понять
// First create a vector 3 and assign a_position xy components, and z component to 1
vec3 position = vec3(a_position, 1.0);
// Transform the point with the 3D matrix
vec3 transformed = u_matrix * position;
// Set the clip space vec4 with the transformed position x and y components
// Set z to 0 and w to 1
gl_Position = vec4(transformed.xy, 0.0, 1.0);