Not necessarily. Typically you’d just use texture unit 0:
glActiveTexture( GL_TEXTURE0 );
but you don’t “have” to use that one (when using shaders) if you’re only using one texture. You just plug the texture unit number into the sampler (texture unit) uniform via glUniform1i, and the shaders will access the right one.
But with the fixed-function pipeline, yeah, IIRC you generally want to populate the texture units in order (0,1,2,3,…) until you run out of textures. Easier that way.
Because I have seen examples of single texturing that don’t include any texture units.
Yes, they’re just assuming glActiveTexture is GL_TEXTURE0 by default.
Edit: Also, do this make any sense? This is code I found. Do I have to //enable stuff for each of the texture units?
Careful. This is old legacy pipeline stuff. And this is gl<u>Client</u>ActiveTexture, which is used to set which texture coordinate GL_TEXTURE_COORD_ARRAY refers to. Not glActiveTexture, which sets which texture unit the next texture bind will bind to.
Now in the old fixed-function pipe, there was typically a direct correspondence between texture coordinate numbers and texture unit numbers, but IIRC this was gotten rid of by texture combiners, and then totally eliminated with modern shaders many GPU generations ago.
If you use glVertexAttribPointer (new-style vertex attributes), then there’s no need to use glClientActiveTexture anymore.