My understanding is that glBindAttribLocation
allows you to custom set a handle to an attribute (before linking a shader program), which you can later use when rendering with glVertexAttribPointer
.
But you don't have to use it, and may instead just rely on OpenGL assigning whatever handle it so chooses in its infinite wisdom. However, you would then need to query OpenGL to find out this handle by using glGetAttribLocation
at some point before rendering with glVertexAttribPointer
.
Now you could use glGetAttribLocation
each time you render, which would seem wasteful since you can just use glGetAttribLocation
once after building your program, then store the handle.
So essentially, you can store this handle by either using glBindAttribLocation
or by using glGetAttribLocation
so is there any difference performance-wise and what are the pros and cons of one over the other?
I cannot speak much about the direct performance difference, but it should be irrelevant anyway, since no matter if using glBindAttribLocation
or glGetAttribLocation
, you're doing it at initialization time anyway (and even then calling glGetAttribLocation
shouldn't hurt that much).
But the main difference and advantage of an explicit glBindAttribLocation
over letting GL decide is, that it allows you to establish your own attribue semantics and keep them consistent for each and every shader.
Say you have a whole bunch of objects and a whole bunch of shaders. But each shader has some notion of a position attribute (and normal, color, ...), likewise each object has attribute data for positions, normals, ... Now with glBindAttribLocation
you can bind your position attribute to location 0 in each and every different shader. So when drawing your objects with different shaders, they can use a single vertex format (i.e. how you call glVertexAttribPointer
for the individual attributes, and the individual enable calls).
On the other hand glGetAttribLocation
doesn't give you any guarantees about what attributes get which indices (maybe one shader has some additional attribute and the compiler thinks it's a good way to reorder them, who knows). So in this case you have a different vertex format (glVertexAttribPointer
call) for each object and each shader.
This is even more important when using Vertex Array Objects (which encapsulate all the attribute state, especially the glVertexAttribPointer
and glEnableVertexAttribArray
calls). In this case you usually don't need (and don't want) to call glVertexAttribPointer
each time you draw an object with another shader.
So the bottom line is, always use glBindAttribLocation
, at best (in a large application) it saves you many object and shader management issues and many unneccessary glVertexAttribPointer
calls each frame (and that can likely be a performance gain), and at least (in a very small application) it is good practice and lets you stay open and flexible for extensions. As a side note, in desktop GL 3+ (or with the ARB_explicit_attrib_location extension) you can even assign attribute locations directly in the shader without the need for any API call.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With