Пишу на досуге движок (без претензий на шедевр). В числе прочего склепал скелетную анимацию классического формата: кости приводятся по интерполированным ключам в желаемую позу, затем по положению костей в соответствии с их весами в вершине ошкуривается меш (вычисляется позиция вершины относительно каждой кости как единственной, а затем взвешенная сумма даёт итоговую позицию). Полученные позиции вершин пишутся в вершинный буфер (массив 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 тоже неправильно. А потому спрашиваю у мудрого сихана и опытных сэмпаев: а что мне, собственно, делать?
Кидать на вывод вершинный буфер без индексного не получается: тогда грани формируются из вершин в произвольном порядке и получается кракозябр. Буду очень рад пояснению. Заранее прошу прощения за глубинное ламерство.