1

こんにちは私は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ます。MapTileインターネットからダウンロードした35枚の画像に対して35回作成されます。そして、スレッドは35MapTileオブジェクトに対してこのメ​​ソッドを35回呼び出し、それを実行し続けます。そのため、最初にメソッドが呼び出されるかどうかを確認して、データをロードし、オブジェクトごとに1回だけVBOIDを生成できるようにしMapTileます。この行でこれを確認しif(decompressTileImage->tileTexure == 0)ます。そして、毎回vboidをバインドして描画します。データを再度ロードする必要はありません。

これdecompressTileImageTextureImageInfoクラスです。実装は

#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条件でメモリにロードされているかどうかを確認しました。

4

1 に答える 1

2

コメントに示されているように、OpendGL ESコマンドは、コンテキストが作成されたのと同じスレッドから送信する必要があります。

BlackberryドキュメントからOpenGLESを使用した並列処理

各OpenGLESレンダリングコンテキストは、実行の単一スレッドを対象としていることに注意することが重要です。

複数のシーンをレンダリングする場合は、各シーンを独自のスレッドに分割して、各スレッドに独自のコンテキストがあることを確認できます。

于 2013-03-21T11:32:52.027 に答える