ある時点でピクセル データをクリアし、ファイルから新しいテクスチャ ピクセル データをロードする必要がある 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 が持っているテクスチャ データをすべて消去できる代替手段はありますか?