Пишу на досуге движок (без претензий на шедевр). В числе прочего склепал скелетную анимацию классического формата: кости приводятся по интерполированным ключам в желаемую позу, затем по положению костей в соответствии с их весами в вершине ошкуривается меш (вычисляется позиция вершины относительно каждой кости как единственной, а затем взвешенная сумма даёт итоговую позицию). Полученные позиции вершин пишутся в вершинный буфер (массив float*). После этого в соответствии с индексным буфером (массив unsigned int*) осуществляю рендер:
    glEnableClientState (GL_VERTEX_ARRAY);
    glEnableClientState (GL_NORMAL_ARRAY );
    glEnableClientState (GL_TEXTURE_COORD_ARRAY);
    glBindTexture ( GL_TEXTURE_2D, m_uTextureID );
    glVertexPointer (3,GL_FLOAT,0,m_pfVertexBuffer);
    glTexCoordPointer(2,GL_FLOAT,0,m_pfTexCoordBuffer);
    glNormalPointer(3,GL_FLOAT,m_pfNormalBuffer);
    
    glDrawElements(GL_TRIANGLES, m_uiNumFaces*3, GL_UNSIGNED_SHORT, m_pusIndexBuffer); 
    glDisableClientState (GL_VERTEX_ARRAY);
    glDisableClientState (GL_NORMAL_ARRAY );
    glDisableClientState (GL_TEXTURE_COORD_ARRAY);
Всё пока делается на CPU, что безусловно неправильно и пора вводить шейдеры (с ними ещё предстоит разбираться).
   И вот вопрос. Вершинный шейдер, как известно, обсчитывает одну вершину. Но сами-то вершины поступают в соответствии с их индексами в треугольниках, которых уже больше чем вершин раза в полтора. А в каждом треугольнике их, как известно, три. 
    То есть вырисовывается нехорошая перспектива обрабатывать каждую вершину по несколько раз, что, разумеется, неправильно.
Не использовать же GPU тоже неправильно. А потому спрашиваю у мудрого сихана и опытных сэмпаев: а что мне, собственно, делать?
Кидать на вывод вершинный буфер без индексного не получается: тогда грани формируются из вершин в произвольном порядке и получается кракозябр. Буду очень рад пояснению. Заранее прошу прощения за глубинное ламерство. 