2013-03-21 31 views
1

您好我正在使用VBO加載圖像紋理,然後用C++繪製它。 VBO ID生成和綁定和平局發生在這裏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次,並繼續這樣做。這就是爲什麼我首次檢查是否第一次調用該方法,以便可以爲每個對象加載數據並生成一次VBO ID。我用if(decompressTileImage->tileTexure == 0)這一行檢查了這一點。然後每次我只綁定vbo id進行繪製。無需再次加載數據。

這裏decompressTileImageTextureImageInfo類。執行是

#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 2013-03-21 11:16:05

+0

我認爲你是對的。我在QThread中完成了與vbo有關的所有工作。但我正在從主線程刪除緩衝區。你可以讓這個答案? – Tahlil 2013-03-21 11:21:08

+0

我在QThread中創建EGL上下文。所以所有與opengl相關的作品都應該在QThread中完成。但是這裏的析構函數是從主線程調用的。 – Tahlil 2013-03-21 11:28:48

回答

2

如註釋中所示,OpendGL ES命令應該從創建上下文的同一線程提交。

從BlackBerry文檔Parallel processing with OpenGL ES

重要的是要注意,每個OpenGL ES的渲染上下文的目標 執行一個線程是很重要的。

如果你想渲染多個場景,你可以每個場景 分成自己的線程,並確保每個線程都有自己的上下文

+1

很不錯的猜測:) – 2013-03-21 11:34:32

+0

是完美的猜測:D – Tahlil 2013-03-21 12:12:59