VBO ничего не рисует

Я пытаюсь нарисовать квадрат с VBO в моем родном приложении Blackberry 10. Моя реализация

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glGenBuffers(1,&decompressTileImage->VBOId);
glBindBuffer(GL_ARRAY_BUFFER,decompressTileImage->VBOId);
glBufferData(GL_ARRAY_BUFFER,sizeof(tileCoordList)+sizeof(tileTextureCoordList),0,GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(tileCoordList),tileCoordList);
glBufferSubData(GL_ARRAY_BUFFER,sizeof(tileCoordList),sizeof(tileTextureCoordList),tileTextureCoordList);

glTexCoordPointer(3, GL_FLOAT, sizeof(tileTextureCoordList), (void*)sizeof(this->tileCoordList));
glVertexPointer(3, GL_FLOAT, sizeof(tileCoordList), 0);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisable(GL_BLEND);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

swapBuffers();

Здесь tileCoordList содержит координаты для квадрата, а tileTextureCoordList содержит соответствующую текстуру. tileCoordList это Square3D Типовая структура.

typedef struct
{
Vertex3D lowerLeft;
Vertex3D lowerRight;
Vertex3D upperLeft;
Vertex3D upperRight;
}Square3D;

typedef struct
{
GLfloat x;
GLfloat y;
GLfloat z;
} Vertex3D;

4 Vertex3D представляет квадрат в плитке CoordList. То же самое касается tileTextureCoordList, Я могу хорошо рисовать без VBO, хотя. Я использую opengl-es 1.1

Другой вопрос.

Если я создам два VBO. Предположим, я связал первый с его идентификатором, скопировал данные и нарисовал его. А потом приходит второй, и я также связываю его, копирую данные и рисую. Теперь, если я хочу снова нарисовать первый, нужно ли связывать его снова? Если мне нужно снова связать, нужно ли мне снова копировать данные в буфер для этого VBO?

1

Решение

В комментариях выяснилось, что tileCoordList а также tileTextureCoordListявляются указателями на Square3D структур.

Это означает, что sizeof Оператор даст вам размер указателя, а не размер структуры.

Вы можете использовать, например,

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(*tileCoordList), tileCoordList);

вместо.

3

Другие решения

Вы делаете что-то странное с вашим буфером. Не зная что tileCoordList Трудно сказать, правильно ли вы добавляете данные.

В общем, в отношении обеих ваших проблем здесь: VBO хранят данные для вас. Это не только возможно, но и рекомендуется делать:

vbo_1, vbo_2;

vbo1.LoadData(data_1);
vbo2.LoadData(data_2);

main_loop {
vbo1.Bind();
Draw();
vbo2.Bind();
Draw();
}

Я использовал псевдокод здесь, но вы должны понять. Я не понимаю что SubData звонок должен делать; в общем один простой glBufferData должно быть достаточно. Bind call устанавливает буфер как активный.

Эта линия заставила меня съежиться — почему VBOId общественности? Пахнет как плохо продуманная абстракция для меня:

glGenBuffers(1,&decompressTileImage->VBOId);

И о, пожалуйста не использовать this->, Здесь только ухудшается читаемость.

1

По вопросам рекламы [email protected]