Как выполнить пакетную визуализацию спрайтов в OpenGL ES (iPhone)

У меня есть игра, которая рендерит кучу спрайтов (несколько сотен), почти все из которых используют одну и ту же текстуру. В настоящее время я вызываю 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);

person Parker    schedule 05.11.2010    source источник
comment
Этот код кажется вашей оригинальной версией, рисующей каждую текстуру с помощью отдельного вызова glDrawArrays, вам передается только 4 вершины...   -  person Ben    schedule 05.11.2010
comment
Первый блок кода повторяется около 200 раз, добавляя новые данные xloc и yloc в массив для каждого спрайта; Я вырезал много кода между ними, поэтому я думаю, что это неясно. Я постараюсь отредактировать его, чтобы он имел больше смысла.   -  person Parker    schedule 05.11.2010
comment
Где вы определяете массив coordinates? Сколько в нем элементов?   -  person genpfault    schedule 05.11.2010
comment
Он определен в классе Texture2D и имеет 4 пары (всего 8 элементов) GLfloats для 4 углов самой текстуры. Должен ли этот массив соответствовать размеру буфера вершин?   -  person Parker    schedule 05.11.2010
comment
Как вы управляете массивом blueSpriteVertices[]? Вы конструируете его каждый кадр? Когда некоторые из спрайтов больше не нужны, что вы делаете? Вы удаляете некоторые строки?   -  person Nuno Miguel Fonseca    schedule 15.12.2011


Ответы (3)


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

person Parker    schedule 05.11.2010

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

glDrawElements(GL_TRIANGLES, 6 * mSpriteCounter, GL_UNSIGNED_SHORT, (char*) NULL);
person olafure    schedule 04.02.2011

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

person Istvan    schedule 05.11.2010
comment
Я попытался изменить последний параметр glDrawArrays(), но он нарисовал один огромный беспорядок из треугольных полос, которые соединяли все мои спрайты вместе. Я хочу целую кучу отдельных спрайтов, каждый из которых представляет собой комбинацию двух треугольников. Я попробую изменить массив координат текстуры и снова отвечу через несколько минут. - person Parker; 05.11.2010
comment
После изменения массива координат текстуры и последнего параметра glDrawArrays() он по-прежнему рисует весь беспорядок из треугольных полос, за исключением того, что все полосы содержат растянутую текстуру (а не только сплошной цвет, как раньше). Так что, думаю, это был шаг в правильном направлении. - person Parker; 05.11.2010
comment
Затем проверьте массивы координат, чтобы убедиться, что они указаны правильно в соответствии с координатами полосы треугольника. - person Istvan; 05.11.2010