2013-03-21 2 views
1

Привет Я использую VBO для загрузки текстуры изображения, а затем рисую его на C++. ВБО идентификатор создания и связывания и дро происходит здесьglDeleteBuffers сбой во время вызова деструктора

void ViewManager::render(){ 

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); 
if(decompressTileImage->tileTexure == 0) 
    { 
     loadTexture(decompressTileImage); 
     glGenBuffers(1,&decompressTileImage->VBOId); 
     glBindBuffer(GL_ARRAY_BUFFER,decompressTileImage->VBOId); 
     glBufferData(GL_ARRAY_BUFFER,sizeof(*(this->tileCoordList))+sizeof(*(this->tileTextureCoordList)),0,GL_STATIC_DRAW); 
     glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(*(this->tileCoordList)),this->tileCoordList); 
     glBufferSubData(GL_ARRAY_BUFFER,sizeof(*(this->tileCoordList)),sizeof(*(this->tileTextureCoordList)),this->tileTextureCoordList); 

    } 
    else 
    { 
     glBindBuffer(GL_ARRAY_BUFFER,decompressTileImage->VBOId); 
     glBindTexture(GL_TEXTURE_2D, decompressTileImage->tileTexure); 
    } 

    glColor4f(1.0f, 1.0f, 1.0f, textureAlpha); 

    if(textureAlpha < 1.0) 
    { 
     textureAlpha = textureAlpha + .03; 
     this->tiledMapView->renderNow(); 
    } 

glTexCoordPointer(3, GL_FLOAT, 0, (void*)sizeof(*(this->tileCoordList))); 
glVertexPointer(3, GL_FLOAT, 0, 0); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
glBindBuffer(GL_ARRAY_BUFFER,0); 
glDisable(GL_BLEND); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 
} 

Эта функция в классе с именем MapTile. MapTile создано 35 раз для 35 изображений, загруженных из Интернета. И затем поток вызывает этот метод 35 раз за 35 MapTile объект и продолжает делать это. Вот почему я сначала проверяю, вызван ли метод впервые, чтобы я мог загружать данные и генерировать идентификатор VBO только один раз для каждого объекта MapTile. Я проверяю это с помощью if(decompressTileImage->tileTexure == 0) этой строки. а затем каждый раз, когда я просто привязываю идентификатор vbo для рисования. Не нужно снова загружать данные.

Здесь decompressTileImage является классом TextureImageInfo. Реализация

#include "TextureImageInfo.h" 
TextureImageInfo::TextureImageInfo(unsigned char * image,GLuint format,int texWidth,int texHeight,int imageWidth,int imageHeight,float tex_x,float tex_y) 
{ 
// TODO Auto-generated constructor stub 
this->format = format; 
this->image = image; 
this->imageHeight = imageHeight; 
this->imageWidth = imageWidth; 
this->texHeight = texHeight; 
this->texWidth = texWidth; 
this->tileTexure = 0; 
this->VBOId = 0; 
this->time = 0; 

} 

TextureImageInfo::~TextureImageInfo() 
{ 
if(VBOId!=0) 
    glDeleteBuffers(1,&VBOId); 
} 

Он рисует и делает все нормально, но вылетает при попытке очистить память в деструкторе TextureImageInfo класса, который дается здесь. Я не понимаю, почему. Я проверил, генерируется ли VBOId и загружается в память с условием if в деструкторе.

+2

Какой тип аварии вы получите? И где вызывается деструктор (находится ли он в том же потоке, что и контекст OpenGL)? – Kimi

+0

Я думаю, что ты прав. Я выполнил всю связанную с vbo работу в QThread. Но я удаляю буфер из основного потока. Можете ли вы ответить на этот вопрос? – Tahlil

+0

Я создаю контекст EGL в QThread. Поэтому все работы, связанные с opengl, также должны выполняться в QThread. Но здесь деструктор вызывается из основного потока. – Tahlil

ответ

2

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

С Blackberry документы Parallel processing with OpenGL ES:

Важно отметить, что каждый контекст рендеринга OpenGL ES цели один поток выполнения.

Если вы хотите сделать несколько сцен, вы можете разделить каждую сцену в своем собственном потоке, убедившись, что каждый поток имеет свой собственный контекст

+1

очень хорошее предположение :) –

+0

Да, это идеальное предположение: D – Tahlil

Смежные вопросы