gpt4 book ai didi

c++ - glDeleteBuffers 在析构函数调用期间崩溃

转载 作者:行者123 更新时间:2023-11-30 04:19:53 27 4
gpt4 key购买 nike

您好,我正在使用 VBO 加载图像纹理,然后用 C++ 绘制它。 VBO id 生成、绑定(bind)和绘制发生在这里

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 为从 Internet 下载的 35 张图像创建了 35 次。然后一个线程为 35 个 MapTile 对象调用此方法 35 次并继续执行。这就是为什么我首先检查该方法是否第一次被调用,以便我可以为每个 MapTile 对象加载数据和生成 VBO id 一次。我用 if(decompressTileImage->tileTexure == 0) 这一行来检查这个。然后每次我只绑定(bind) 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 类的析构函数中的内存时崩溃。我不明白为什么。我检查了是否在析构函数中使用 if 条件生成并加载了 VBOId 到内存中。

最佳答案

如评论中所述,OpendGL ES 命令应从创建上下文的同一线程提交。

来自黑莓文档 Parallel processing with OpenGL ES :

It is important to note that each OpenGL ES rendering context targets a single thread of execution.

If you want to render multiple scenes, you can separate each scene into its own thread, making sure each thread has its own context

关于c++ - glDeleteBuffers 在析构函数调用期间崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15545528/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com