While you are free to use any legal combination of these bits, there are certain uses of buffer objects that lend themselves to certain bitfield combinations.Pure in-Open GL buffers: Sometimes, it is useful to have a buffer object that is owned almost entirely by Open GL processes.For example, if you want to have a buffer store the results of a vertex shader computation through the use of transform feedback, the user is not directly changing the buffer information.Similarly, the user can read a buffer's data, using a variety of commands.Or, the user can execute an Open GL command that causes the GL to read the contents of the buffer and do something based on it.Buffer objects hold a linear array of memory of arbitrary size.This memory must be allocated before it can be uploaded to or used.Allocating immutable storage for a buffer changes the nature of how you can interact with the buffer object.
Open GL will copy that data into the buffer object upon initialization.
You may pass NULL for this parameter; if you do, the initial contents of the buffer will be undefined.
In this case, all you really need is the ability to allocate storage of some fixed size.
Static data buffers: In some cases, data stored in a buffer object will not be changed once it is uploaded.
For example, vertex data can be static: set once and used many times.