2013-03-20 5 views
1

Я изучал OpenGL и смог создать успешную 2d-систему рисования с использованием треугольных полосок. Я написал генератор частиц, чтобы проверить дозирование геометрии, и все работает хорошо, я могу отображать 30k + вершин со скоростью 60 кадров в секунду на iPhone 5. Я использую дегенеративные треугольники для соединения частиц и их рисования сразу. То, что я пытаюсь выполнить, - пакетное рендеринг без использования дегенеративных треугольников, поскольку это уменьшит количество данных, отправляемых на GPU, на 1/3 суммы, которая будет огромной.Batching OpenGL sprites

Я пытаюсь использовать glDrawElements с треугольниками, чтобы нарисовать 2 спрайтов с помощью следующего кода

//the vertices for the square (2d) 
GLfloat square[] = { 
    50, 50, //bottom left 
    100, 50, //bottom right 
    50, 100, //top left 
    100, 100, //top right 

    150, 200, //bottom left 
    200, 150, //bottom right 
    150, 200, //top left 
    200, 200 //top right 
}; 

//texture coords 
GLfloat tex[] = { 
    0,0, 
    1,0, 
    0,1, 
    1,1, 

    0,0, 
    1,0, 
    0,1, 
    1,1 
}; 

GLubyte indices[] = 
{ 
    0,2,3, 
    0,3,1, 

    0,2,3, 
    0,3,1 
}; 

//actual drawing code 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, square); 
glVertexAttribPointer(ATTRIB_TEX, 2, GL_FLOAT, GL_FALSE, 0, tex); 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, image); 

glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_BYTE, indices); 

Этот код рисует первое изображение без проблем, но второе изображение искажено. Я смотрю онлайн, но не смог понять, как правильно сделать эту работу.

ответ

0

Прежде всего, вы используете одни и те же индексы для обоих квадов, поэтому второе изображение вообще не должно быть видимым.

За исключением того, что данные вашей вершины для второго квадранта испорчены, у вас есть точка (150, 200) два раза, первая должна, вероятно, быть (150, 150).

+0

Хорошо, я скорректировал квадратные координаты (lol) и изменил второй набор индексов на 4,6,7,4,7,5, и он отобразился правильно. Теперь мой вопрос в том, как я могу отображать большое количество элементов, если мне нужно продолжать увеличивать значения индексов? –