1

SDL を使用して画像を読み込み、OpenGL クワッドに割り当てています。その方法を示すチュートリアルを見つけましたが、プログラムを実行すると、SDL Surface 変数 (コード内の surface) が初期化されずに使用されていると表示されます。他の言語の知識を使って解決策を見つけたが、運がなかったので、クラスを使用しているためかどうかはわかりません。

ここにいくつかのコードがあります: エンティティクラス (これまで):

//d2_entity.h
class d2Entity
{
public:
    bool LoadImage(const char* fileName);
    void DrawImage();
    void Clear();

private:
    GLuint *texture;
    GLenum textureFormat;
    GLint noColours;
};

//d2_entity.cpp
bool d2Entity::LoadImageW(const char* fileName)
{
SDL_Surface *surface;

if((surface == IMG_Load(fileName)))
{
    // Check if image size is a power of 2
    if((surface->w & (surface->w - 1)) != 0)
        cout << "Opps! '" << fileName << "'s' width is not a power of 2!";
    if((surface->h & (surface->h -1)) != 0)
        cout << "Opps! '" << fileName << "'s' height is not a power of 2!";

    // Get the No. of channels
    d2Entity::noColours = surface->format->BitsPerPixel;
    // Contains a alpha channel  
    if(d2Entity::noColours == 4)
    {
        if(surface->format->Rmask == 0x000000ff)
            d2Entity::textureFormat = GL_RGBA;
        else
            d2Entity::textureFormat = GL_BGRA;
    }
    // No alpha channel
    else if(d2Entity::noColours == 3)
    {
        if(surface->format->Rmask == 0x000000ff)
            d2Entity::textureFormat = GL_RGB;
        else
            d2Entity::textureFormat = GL_BGR;
    }
    else
        cout << "Opps! The image '" << fileName << "' is not truecolour!" << endl;

    // Create an OpenGL texture
    glGenTextures(1, d2Entity::texture);
    glBindTexture(GL_TEXTURE_2D, *d2Entity::texture);
    // Set texture streching properties
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, d2Entity::noColours, surface->w, surface->h, 0, d2Entity::textureFormat, GL_UNSIGNED_BYTE, surface->pixels);
}
else
{
    cout << "Opps! The entity image could not be loaded!" << endl;
    SDL_Quit();
    return false;
}

if(surface)
    SDL_FreeSurface(surface);

return true;
}
4

2 に答える 2

3
SDL_Surface *surface;    
if((surface == IMG_Load(fileName)))

を初期化したことがなくsurface、それをの結果と比較しようとしましたIMG_Load。代わりに割り当てるつもりだったと思います。

SDL_Surface *surface;
if((surface = IMG_Load(fileName)))
于 2013-03-06T16:08:44.347 に答える
2

ここで割り当ての代わりに比較を行いました

if((surface == IMG_Load(fileName)))
{

コードは次のとおりです。

SDL_Surface surface;
surface = IMG_Load("image.bmp");

if(surface != NULL)
{
    //do stuff with surface
于 2013-03-06T16:12:01.767 に答える