Edit for the edit:
buffer creation with initialisation
: it's like the difference between inta = new int[10]
anda[0] = 0,a[1] = 1.... etc
when you create a buffer you make room for the data and when you init the data you put the stuff you want in there.buffer data update
if it's on the cpu ram then you havevertex * vertices
that you can play with it, if it's not there , you would have to move it from GPUvertex * vertices = map(buffer_id);
(map is a mythological function that should move data from GPU to CPU ram, it also has it's opositebuffer_id = create_buffer(vertices)
;binding the buffer as active
it's just a concept that they callbinding
rendering is a complex process and it's like calling a function with 10000 parameters. Binding is just a term they used for telling which buffer goes where. There is no real magic behind this term, it does not convert or move or reallocate buffers, just tells the driver that on the next draw call use this buffer.API draw call
After all the binding and setting buffers up this is the place where rubber meets the road. The draw call will take all the data (or the id's that point to the data) you specified, sent it to the GPU (if needed) and tell the GPU to start crunching the numbers. This is not entirely true on all the platforms there are many differences, but for keeping thing simple the draw will tell the GPU to .... draw.