SDL2(C ++)并非所有.png图像都能正确呈现

时间:2017-01-08 18:08:36

标签: c++ opengl sdl sdl-2

注意:我使用的是Legacy OpenGL

所以我遇到了一个只能正确渲染几个.png图像的问题。

以下是渲染游戏的示例屏幕截图(左:enemyRed.png,右:( ship.png)):

Screenshot of rendered game

以下是我用来加载图片的代码:

SpriteImage* SDLOpenGL::loadImage(std::string path) {
    SDL_Surface * surface = IMG_Load(path.c_str());
    SpriteImage * image = new SpriteImage(&*surface);

    return image;
}

这是SpriteImage类:

SpriteImage::SpriteImage(SDL_Surface *surface) {
    this->surface = surface;
    this->TextureID = 0;
}

void SpriteImage::bind() {
    glTexImage2D(GL_TEXTURE_2D,
            0,
            this->mode,
            this->surface->w,
            this->surface->h,
            0,
            this->mode,
            GL_UNSIGNED_BYTE,
            this->surface->pixels
            );
    glBindTexture(GL_TEXTURE_2D, this->TextureID);
}

int SpriteImage::getWidth() {
    return this->surface->w; 
}

int SpriteImage::getHeight() {
    return this->surface->h;
}

这是我渲染图片的地方:

(注意,this->getCurrentImage()返回“SpriteImage”)

void Sprite::draw(float delta) {
    this->getCurrentImage()->bind();

    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0.0f, 0.0f);

    glTexCoord2f(0, 1);
    glVertex2f(0.0f, this->getHeight());

    glTexCoord2f(1, 1);
    glVertex2f(this->getWidth(), this->getHeight());

    glTexCoord2f(1, 0);
    glVertex2f(this->getWidth(), 0.0f);
    glEnd();

    this->next();
}

1 个答案:

答案 0 :(得分:0)

  • 不渲染的图像的宽度不可分割为四。您应该在glPixelStorei之前使用GL_UNPACK_ALIGNMENTglTexImage2D来指定内存中行的对齐方式 - 这可能是未对齐的(默认情况下,OpenGL假定它们 4 -byte aligned)。

  • 您应先glBindTexture然后使用glTexImage2D上传数据。

  • 你有没有打电话给glGenTextures?您应该使用TextureID初始化glGenTextures

  • 每次绑定纹理时都不应上传纹理。而是将其上传到构造函数中,然后切换纹理,只需要glBindTexture TextureID {/ 1>}。