1

ある時点でピクセル データをクリアし、ファイルから新しいテクスチャ ピクセル データをロードする必要がある Texture クラスがあります。最初のテクスチャを読み込んで表示します。ただし、表示されるテクスチャを変更する場合は、古いピクセル データを新しい画像の寸法で表示するだけです。

への呼び出しを使用して、OpenGL のバッファから古いピクセル データをクリアしようとしていますglBindBuffers。まず、この関数で古いテクスチャ名を削除しますreloadTexture()

void Texture::reloadTexture(string filename)
{
    //first and foremost clear the image and buffer vectors back down to nothing so we can start afresh 
    buffer.clear();
    image.clear();
    w = 0;
    h = 0;
    //also delete the texture name we were using before
    glDeleteTextures(1, &textureID[0]);

    const char* fnPtr = filename.c_str(); //our image loader accepts a ptr to a char, not a string
    //printf(fnPtr);

    lodepng::load_file(buffer, fnPtr);//load the file into a buffer

    unsigned error = lodepng::decode(image,w,h,buffer);//lodepng's decode function will load the pixel data into image vector from the buffer
    //display any errors with the texture
    if(error)
    {
        cout << "\ndecoder error " << error << ": " << lodepng_error_text(error) <<endl;
    }
    //execute the code that'll throw exceptions to do with the images size
    checkPOT(w);
    checkPOT(h);



    //loop through and //printf our pixel data
    /*for(GLuint i = 0; i<image.size(); i+=4)
    {
    //printf("\n%i,%i,%i,%i,", image.at(i),image.at(i+1),image.at(i+2),image.at(i+3));

    }*/

    ////printf("\nImage size is %i", image.size());

    //image now contains our pixeldata. All ready for  to do its thing

    //let's get this texture up in the video memoryOpenGL
    texGLSecondaryInit();

    Draw_From_Corner = CENTER;
}

次に、関数texGLSecondaryInit()で、残りのピクセル データをすべてクリアし、別のファイルから新しいデータを読み込もうとします。

void Texture::texGLSecondaryInit()
{

    glGenTextures(1, &textureID[0]);
    ////printf("\ntextureID = %u", textureID[0]);

    glBindTexture(GL_TEXTURE_2D, textureID[0]);//evrything we're about to do is about this texture
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    //glDisable(GL_COLOR_MATERIAL);
    glBindBuffer(GL_PIXEL_UNPACK_BUFFER,0);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,w,h,0, GL_RGBA, GL_UNSIGNED_BYTE, &image[0]);

    //we COULD free the image vectors memory right about now.
    image.clear();
}

バッファをクリアして、テクスチャが描画する新しいピクセル データであることを確認するために、この質問で使用することをお勧めしglBindBuffer(GL_PIXEL_UNPACK_BUFFER,0);まし。ただし、これを行うと、アクセス違反の未処理の例外エラーが発生します。

An unhandled exception of type 'System.AccessViolationException' occurred in Spritey.exe Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

また、これがシステム エラーであることにも気付きました。Textureクラスがマネージ コードではないという事実と関係がある可能性があることを意味します。しかし、私はコンパイラにこれを認識させます

#pragma managed(off,push)

ここに安全に電話できない理由を誰か知っていglBindBufferますか? または、openGL が持っているテクスチャ データをすべて消去できる代替手段はありますか?

4

0 に答える 0