您好我使用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);
}
此函数位于名为MapTile
的类中。对于从互联网下载的35张图片,创建了{35}次MapTile
。然后一个线程为35 MapTile
个对象调用此方法35次,并继续这样做。这就是为什么我首先检查是否第一次调用该方法,以便我可以为每个MapTile
对象加载数据并仅生成一次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条件。
答案 0 :(得分:2)
如评论中所示,应该从创建上下文的同一线程提交OpendGL ES命令。
来自Blackberry docs Parallel processing with OpenGL ES:
重要的是要注意每个OpenGL ES渲染上下文的目标 单个执行线程。
如果要渲染多个场景,可以分隔每个场景 进入自己的线程,确保每个线程都有自己的上下文