Please consider the following vertex structure
struct vertex {
vec3 posL, normalL;
};
Using this vertex layout, we can provide the vertex data in an interleaved way, i.e. (posL,normalL),(posL',normalL'),... This works pretty fine in combination with indexed drawing via glDrawElements().
However, if we add texture coordinates to our vertex structure, i.e. consider
struct vertex
{
vec3 posL, normalL;
vec2 tex;
};
things get more complicated. Since one and the same vertex (meaning it's position) may participate in a variety of different faces with varying texture coordinates, I wondered how one would provide such vertex data to the vertex buffer.
One solution would be to quit storing the data interleaved and provide it a linear way, i.e. (posL,posL',...),(normalL,normalL',...),(tex,tex',...) where each tuple has the same length. Doing so, we would hold related things together (i.e. the k-th element of each tuple forms exactly one input the vertex shader sees).
But we would push much more data to the pipeline than necessary. So, what's the "ideal" solution to this problem? If one suggests to use different buffers, how does the vertex shader know, that texture coordinate tex
at position i
in Buffer 2 corresponds to the tuple (posL,normalL
) at position j
in Buffer 1?