Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
glDeleteBuffers在析构函数调用期间崩溃 我用VBO加载图像纹理,然后用C++绘制。VBO id在此处生成、绑定和绘制 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); }_C++_Opengl Es_Textures_Blackberry 10_Vbo - Fatal编程技术网

glDeleteBuffers在析构函数调用期间崩溃 我用VBO加载图像纹理,然后用C++绘制。VBO id在此处生成、绑定和绘制 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); }

glDeleteBuffers在析构函数调用期间崩溃 我用VBO加载图像纹理,然后用C++绘制。VBO id在此处生成、绑定和绘制 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); },c++,opengl-es,textures,blackberry-10,vbo,C++,Opengl Es,Textures,Blackberry 10,Vbo,当我试图清理TextureImageInfo类的析构函数中的内存时,它会绘制并完成所有工作,但会崩溃。我不明白为什么。我检查了VBOId是否也在析构函数中使用if条件生成并加载到内存中 如注释所示,OpendGL ES命令应该从创建上下文的同一线程提交 从Blackberry文档: 需要注意的是,每个OpenGL都是渲染上下文的目标 单线程执行 如果要渲染多个场景,可以分离每个场景 进入自己的线程,确保每个线程都有自己的上下文 你会遇到什么类型的车祸?在哪里调用析构函数(与OpenGL上下文在同

当我试图清理
TextureImageInfo
类的析构函数中的内存时,它会绘制并完成所有工作,但会崩溃。我不明白为什么。我检查了VBOId是否也在析构函数中使用if条件生成并加载到内存中

如注释所示,OpendGL ES命令应该从创建上下文的同一线程提交

从Blackberry文档:

需要注意的是,每个OpenGL都是渲染上下文的目标 单线程执行

如果要渲染多个场景,可以分离每个场景 进入自己的线程,确保每个线程都有自己的上下文


你会遇到什么类型的车祸?在哪里调用析构函数(与OpenGL上下文在同一线程中)?我想你是对的。我已经在QThread中完成了所有与vbo相关的工作。但是我正在从主线程删除缓冲区。你能回答这个问题吗?我正在QThread中创建EGL上下文。因此,所有与opengl相关的工作也应该在QThread中完成。但是这里的析构函数是从主线程调用的。
#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);
}