1

次のものを含むModel2Dクラスがあります。

class Model2D
{
    public: //it's private, but I'm shortening it here
    unsigned char* bitmapImage;
    unsigned int textureID;
    int imageWidth, imageHeight;

    void Load(char* bitmapFilename);
}
void Model2D::Load(char* bitmapFilename)
{
    ifstream readerBMP;
    readerBMP.open(bitmapFilename, ios::binary);
    //I get the BMP header and fill the width, height

    bitmapImage = new GLubyte[imageWidth * imageHeight * 4];
    //Loop to read all the info in the BMP and fill the image array, close reader

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_2D, textureID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapImage);
}
void Model2D::Draw()
{
    glBegin(GL_QUADS);          
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glBindTexture(GL_TEXTURE_2D, textureID);

    float texScale = 500.0; //this is just so I don't have to resize images

    glTexCoord2f(0.0, 0.0); glVertex3f(-(imageWidth / texScale), -(imageHeight / texScale), 0.0);
    glTexCoord2f(0.0, 1.0); glVertex3f(-(imageWidth / texScale), (imageHeight / texScale), 0.0);
    glTexCoord2f(1.0, 1.0); glVertex3f((imageWidth / texScale), (imageHeight / texScale), 0.0);
    glTexCoord2f(1.0, 0.0); glVertex3f((imageWidth / texScale), -(imageHeight / texScale), 0.0);    
}

そして、私のメインループには、次のものがあります。

Model2D spritest;
spritest.LoadFromScript("FirstBMP.bmp");
spritest.Z(-5); spritest.X(-2);

Model2D spritest2;
spritest2.LoadFromScript("SecondBMP.bmp");
spritest2.X(+2); spritest2.Z(-6);

//...
//main loop
spritest.Draw();
spritest2.Draw();

デバッグ中は正常に機能しているように見えますが、ビットマップのアドレスは異なり、OpenGLが生成するtextureIDも異なり、それらも正しく呼び出されています。また、デバッグ中のX、Y、Zの位置も正しくなっています。しかし、何らかの理由で、spritestイメージデータがspritest2によって上書きされています。spritest2からDraw()を呼び出さなくても、 spritestの代わりに画像が表示されます。

これを引き起こしている可能性がありますか?

4

1 に答える 1

1

glBeginのテクスチャ バインディング関数の後に指定する必要がありますDraw

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glBindTexture(GL_TEXTURE_2D, textureID);
glBegin(GL_QUADS);          

glBindTextureのドキュメントには、次のように記載されています。

テクスチャがターゲットにバインドされると、そのターゲットの以前のバインドは自動的に解除されます。

glBeginのドキュメントには、次のように記載されていることもわかります。

glBeginと の間で使用できるのは、GL コマンドのサブセットのみglEndです。コマンドは、、、、、、、、、、、、、、、およびです。glVertex_ glColor_ glSecondaryColor_ glIndex_ glNormal_ glFogCoord_ glTexCoord_ glMultiTexCoord_ glVertexAttrib_ また、上記のコマンドのみを含むディスプレイ リストを使用または実行することもできます。との間に他の GL コマンドが実行されると、エラー フラグが設定され、コマンドは無視されます。glEvalCoordglEvalPointglArrayElementglMaterialglEdgeFlagglCallListglCallListsglBeginglEnd

このため、関数内でand の前Drawに配置する必要があります。それ以外の場合は、 a 内にあり、ターゲットにまだバインドされているため、何もしません。glBindTexture(GL_TEXTURE_2D, textureID);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glBegin(GL_QUADS)glBindTextureglBeginSecondBMP.bmpGL_TEXTURE_2D

于 2012-12-28T18:35:02.923 に答える