您好我正在使用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進行繪製。無需再次加載數據。
這裏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條件生成並加載到內存中的。
你什麼類型的崩潰?哪裏調用析構函數(與OpenGL上下文是否在同一個線程中)? – Kimi 2013-03-21 11:16:05
我認爲你是對的。我在QThread中完成了與vbo有關的所有工作。但我正在從主線程刪除緩衝區。你可以讓這個答案? – Tahlil 2013-03-21 11:21:08
我在QThread中創建EGL上下文。所以所有與opengl相關的作品都應該在QThread中完成。但是這裏的析構函數是從主線程調用的。 – Tahlil 2013-03-21 11:28:48