Привет Я использую 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 в деструкторе.
Какой тип аварии вы получите? И где вызывается деструктор (находится ли он в том же потоке, что и контекст OpenGL)? – Kimi
Я думаю, что ты прав. Я выполнил всю связанную с vbo работу в QThread. Но я удаляю буфер из основного потока. Можете ли вы ответить на этот вопрос? – Tahlil
Я создаю контекст EGL в QThread. Поэтому все работы, связанные с opengl, также должны выполняться в QThread. Но здесь деструктор вызывается из основного потока. – Tahlil