Как выполнить пакетную визуализацию спрайтов в OpenGL ES (iPhone) - PullRequest
3 голосов
/ 05 ноября 2010

У меня есть игра, которая рендерит кучу спрайтов (несколько сотен), почти все из которых используют одну и ту же текстуру. В настоящее время я вызываю glDrawArrays (...) для каждого, который, как я недавно обнаружил, был очень неэффективным. Проведя некоторые исследования, я узнал, что мне нужно поместить все свои вершины для каждого спрайта в один большой буфер вершин и вызвать glDrawArrays (...) только один раз, используя это. Однако, когда я делаю это, он рисует только первый спрайт, а остальные 200 остаются пустыми.

blueSpriteVertices[blueBatchNum * 4] = Vertex3DMake(xloc, yloc, zloc);
blueSpriteVertices[blueBatchNum * 4 + 1] = Vertex3DMake(xloc + size, yloc, zloc);
blueSpriteVertices[blueBatchNum * 4 + 2] = Vertex3DMake(xloc, yloc + size, zloc);
blueSpriteVertices[blueBatchNum * 4 + 3] = Vertex3DMake(xloc + size, yloc + size, zloc);
blueBatchNum++;
//^^This block of code^^ is called iteratively, adding data for various sprites
//(around 200) to the vertex array. "xloc", "yloc", etc. are private members of 
//this sprite class


//Draw the whole batch
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glColor4f(1, 1, 1, 1);

//This code is actually in the Texture2D class implementation, hence "_name"
//and "coordinates"
glBindTexture(GL_TEXTURE_2D, _name);
glVertexPointer(3, GL_FLOAT, 0, blueSpriteVertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_VERTEX_ARRAY);

Ответы [ 3 ]

3 голосов
/ 05 ноября 2010

Я наконец решил эту проблему, используя GL_TRIANGLES вместо GL_TRIANGLE_STRIP, и обработал треугольные полосы вручную.Тем самым я смог устранить все «полоски», которые он интерпретировал между моими спрайтами.Теперь работает как шарм, и пакетная обработка определенно улучшила производительность моей игры астрономически.

2 голосов
/ 04 февраля 2011

Использование (GL_TRIANGLES вместо GL_TRIANGLE_STRIP у меня работает (на Android)

glDrawElements(GL_TRIANGLES, 6 * mSpriteCounter, GL_UNSIGNED_SHORT, (char*) NULL);
0 голосов
/ 05 ноября 2010

Последний параметр glDrawArrays () должен содержать количество вершин (в вашем случае у вас есть только 4).Также вы должны иметь такое же количество координат текстуры, чтобы соответствовать нарисованным вершинам!

...