As mentioned, after creating the texture you need to call:
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
It defaults to GL_REPEAT so you are likely accidentally calling ::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); (etc.) somewhere while that texture is bound.
After creating a texture and setting all of its parameters and data, always unbind the created texture to avoid accidentally changing one of its parameters just because it was left bound after creation.
To be 100% sure, as a test you can set GL_REPEAT just after binding the texture for rendering. If it solves the problem then you have encountered the bind-to-edit problem of OpenGL (and OpenGL ES). That isn’t a solution, however; the solution will be one of the above (or finding the accidental setting of GL_CLAMP_TO_EDGE and eliminating it).
It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums