   glBufferSubData
  I have loaded 4 vertices and 4 texture coordinates in VBO 's CWPlane = new CWVertex[4];CWPlane[0].x = 1.0f;CWPlane[0].y = 0.0f;CWPlane[0].z = 1.0f;CWPlane[1].x = 1.0f;CWPlane[1].y = 0.0f;CWPlane[1].z = 0.0f;CWPlane[2].x = 0.0f;CWPlane[2].y = 0.0f;CWPlane[2].z = 0.0f;CWPlane[3].x = 0.0f;CWPlane[3].y = 0.0f;CWPlane[3].z = 1.0f;CWPlaneTex = new CWTextCoord[4];CWPlaneTex[0].u = 1.0f;CWPlaneTex[0].v = 1.0f;CWPlaneTex[1].u = 1.0f;CWPlaneTex[1].v = 0.0f;CWPlaneTex[2].u = 0.0f;CWPlaneTex[2].v = 0.0f;CWPlaneTex[3].u = 0.0f;CWPlaneTex[3].v = 1.0f;glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");glBindBufferARB = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB");glBufferDataARB = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB");glMapBufferARB = (PFNGLMAPBUFFERARBPROC) wglGetProcAddress("glMapBufferARB");glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)wglGetProcAddress("glUnmapBufferARB");glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) wglGetProcAddress("glDeleteBuffersARB");    glGenBuffersARB(3, CWPrimitives);    glBindBufferARB(GL_ARRAY_BUFFER_ARB, CWPrimitives[0]);    glBufferDataARB(GL_ARRAY_BUFFER_ARB, 4*3*sizeof(float), CWPlane, GL_STATIC_DRAW_ARB );    glGenBuffersARB(3, CWPrimitivesText );// Get A Valid NameglBindBufferARB(GL_ARRAY_BUFFER_ARB, CWPrimitivesText[0]);// Bind The Buffer    glBufferDataARB(GL_ARRAY_BUFFER_ARB, 4*2*sizeof(float), CWPlaneTex, GL_DYNAMIC_DRAW_ARB );Now I want to be able to change the texture coordinates every frame.The above code creates a textured plane. This is how I draw itCWPlaneTex[0].u  = (float)vrepeat;CWPlaneTex[0].v  = (float)hrepeat;CWPlaneTex[1].u  = (float)vrepeat;CWPlaneTex[3].v  = (float)hrepeat;glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_TEXTURE_COORD_ARRAY);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D,  (int)texid);if (g_fVBOSupported == true) {    glBindBufferARB(GL_ARRAY_BUFFER_ARB, CWPrimitives[0]);    glVertexPointer(3, GL_FLOAT, 0, (char *) NULL );// Set The Vertex Pointer To The Vertex Buffers    glBindBufferARB( GL_ARRAY_BUFFER_ARB, CWPrimitivesText[0]);    glBufferDataARB(GL_ARRAY_BUFFER_ARB, 4*2*sizeof(float), CWPlaneTex, GL_DYNAMIC_DRAW_ARB );    glTexCoordPointer(2, GL_FLOAT, 0, (char *) NULL );// Set The TexCoord Pointer To The TexCoord Buffer} else {glVertexPointer(3, GL_FLOAT, 0, CWPlane);// Set The Vertex Pointer To Our Vertex DataglTexCoordPointer( 2, GL_FLOAT, 0, CWPlaneTex );// Set The Vertex Pointer To Our TexCoord Data}glPushMatrix();glTranslatef(x1, z1, y1);glScalef(x2 - x1, z2 - z1, y2 - y1);glColor3f(1, 1, 1);glDrawArrays(GL_QUADS, 0, 4);// Draw All Of The Triangles At OnceglPopMatrix();glDisable(GL_TEXTURE_2D);glDisableClientState(GL_VERTEX_ARRAY);glDisableClientState(GL_TEXTURE_COORD_ARRAY);Right now I'm using  glBufferDataARB(GL_ARRAY_BUFFER_ARB, 4*2*sizeof(float), CWPlaneTex, GL_DYNAMIC_DRAW_ARB ); and it works perfect. Why doesn'tglBufferSubData(GL_ARRAY_BUFFER_ARB, 0, 4*2*sizeof(float), CWPlaneTex);work?   
  It should work, but for the first time you should call glBufferData(), and for all subsequent updates just call glBufferSubData().;  I don't know, which errors do u get if u use it?btw when u switch the texcoords every frame STREAM_DRAW is probably better.also, to upload the new data optimally first [font=CourierNew, monospace][size=2]glBufferDataARB with null as data and then [/font][color=#1C2837][size=2]glBufferSubData the new texcoords.[color=#1C2837][size=2]this let the driver optimize the data [color="#1C2837"]transfe[color=#1C2837][size=2]r   ;  Changed it to glBindBufferARB( GL_ARRAY_BUFFER_ARB, CWPrimitivesText[0]);//no errorglBufferDataARB(GL_ARRAY_BUFFER_ARB, 4*2*sizeof(float), NULL, GL_STREAM_DRAW_ARB ); //no errorglBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 4*2*sizeof(float), CWPlaneTex);//access violation ( application crushes)glTexCoordPointer(2, GL_FLOAT, 0, (char *) NULL );// Set The TexCoord Pointer To The TexCoord BufferAnd it still doesn't work. Im getting access violation error.   ;  Did you setup the function pointer for buffersubdataarb? Its not in your initial initialization list.  glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB"); glBindBufferARB = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB"); glBufferDataARB = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB"); glMapBufferARB = (PFNGLMAPBUFFERARBPROC) wglGetProcAddress("glMapBufferARB"); glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)wglGetProcAddress("glUnmapBufferARB"); glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) wglGetProcAddress("glDeleteBuffersARB");;  Ah thank you karwosts I forgot glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) wglGetProcAddress("glBufferSubDataARB");